2016-11-30 4 views
0

У меня есть следующий запрос:Преобразование alphnumeric к типу даты и используя DATEDIFF

Select MFG.MFGNUM_0, AUH.ID1_0 , AUL.SEQ_0 , AUL.OVAL_0, 
    AUL.NVAL_0 , AUL.COL_0, AUH.EVT_0 , 
    MFG.MFGTRKFLG_0, MFG.MFGSTA_0 , AUH.ADOUSR_0, 
    AUH.HOU_0 , CAST(REPLACE(AUL.OVAL_0,'/','') as INT) , 
    (CAST(REPLACE(AUL.NVAL_0,'/','') as INT)) 

from x3v6.CICPRODAVC.AUDITH AUH 

    left outer join x3v6.CICPRODAVC.MFGHEAD MFG on MFG.MFGNUM_0 = AUH.ID1_0 

    left outer join x3v6.CICPRODAVC.AUDITL AUL on AUH.SEQ_0 = AUL.SEQ_0 

    where STA_0 = 2 and TBL_0 = 'MFGHEAD' and 
    (AUL.COL_0 = 'ENDDAT') and MFG.MFGTRKFLG_0 < 4 

Который возвращает:

MFGNUM_0 ID1_0 SEQ_0 OVAL_0  NVAL_0 COL_0 EVT_0 MFGTRKFLG_0 MFGSTA_0 ADOUSR_0 HOU_0 (No column name) (No column name) 
WO001170 WO001170 45088 29/01/2017 28/01/2017 ENDDAT UPDATE  1   1  MIR   093734  29012017  28012017 

Я хочу сделать вычитание между 2 датами (NVAL) и OVAL , но поля являются буквенно-цифровыми, и я не могу успешно использовать CAST/CONVERT и DATEDIFF, чтобы найти правильное решение. Я попытался использовать REPLACE и сделать вычитание, но это тоже не сработало.

Версия SQL-SRV - 2012R.

+0

У вас есть пример того, что NVAL и OVAL выглядят? Всегда ли они форматируются как: MM/DD/YYYY? –

+0

DD/MM/YYYY - формат –

ответ

0

Вы можете попробовать это (Испытано на SQL Server):

DECLARE @DATE1 VARCHAR(10); 
DECLARE @DATE2 VARCHAR(10); 

SET @DATE1 = '29/01/2017'; 
SET @DATE2 = '25/01/2017'; 

SELECT DATEDIFF(DAY,CONVERT(datetime, @DATE2 , 103),CONVERT(datetime, @DATE1 , 103)) AS DIFF; 

Поскольку OP не знает, как адаптировать свой первоначальный запрос, столь же просто, как:

SELECTt MFG.MFGNUM_0, AUH.ID1_0 , AUL.SEQ_0 , 
AUL.OVAL_0, AUL.NVAL_0 , 
DATEDIFF(DAY,CONVERT(datetime, AUL.NVAL_0 , 103),CONVERT(datetime, AUL.OVAL_0, 103)) DIFF, 
AUL.COL_0, AUH.EVT_0 , 
MFG.MFGTRKFLG_0, MFG.MFGSTA_0 , AUH.ADOUSR_0, 
AUH.HOU_0 , CAST(REPLACE(AUL.OVAL_0,'/','') as INT) , 
(CAST(REPLACE(AUL.NVAL_0,'/','') as INT)) 
FROM x3v6.CICPRODAVC.AUDITH AUH 
LEFT OUTER JOIN x3v6.CICPRODAVC.MFGHEAD MFG ON(MFG.MFGNUM_0 = AUH.ID1_0) 
left outer join x3v6.CICPRODAVC.AUDITL AUL ON(AUH.SEQ_0 = AUL.SEQ_0) 
WHERE STA_0 = 2 and TBL_0 = 'MFGHEAD' AND 
(AUL.COL_0 = 'ENDDAT') and MFG.MFGTRKFLG_0 < 4 
+0

Спасибо за ответ. Я понимаю концепцию, но как это будет работать без ввода буквенных значений, таких как точные даты? –

+0

Просто замените '@ DATE2' на' NVAL_0' и '@ DATE1' на' OVAL_0' в вашем запросе :) – Hackerman

0

Что Hackerman собрать чище, но вот еще один способ:

DECLARE @nval varchar(100) = '30/11/2010'; 
DECLARE @oval varchar(100) = '16/07/2010'; 

SELECT ABS(DATEDIFF(DAY, nval, oval)) -- Note: change DAY to whatever date type you want to compare... 
FROM (VALUES(
    CAST(CONCAT(SUBSTRING(@nval,7,4), SUBSTRING(@nval,4,2), SUBSTRING(@nval,1,2)) AS date), 
    CAST(CONCAT(SUBSTRING(@oval,7,4), SUBSTRING(@oval,4,2), SUBSTRING(@oval,1,2)) AS date) 
)) dates(nval, oval); 
+0

Спасибо за ответ. Я понимаю концепцию, но как это будет работать без ввода буквенных значений, таких как точные даты? –

+0

Да, мой пример был больше о том, чтобы показать вам технику. Вы можете заменить мои переменные на реальные столбцы в таблице. –