2016-11-30 8 views
0

を使用してI次のクエリがあります。日付型に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/CONVERTDATEDIFFを使用することができません。私はREPLACEを使用して減算を試みましたが、それもうまくいきませんでした。

SQL-SRVのバージョンは2012Rです。

+0

NVALとOVALの外観の例はありますか?彼らは常にMM/DD/YYYYの形式ですか? –

+0

DD/MM/YYYYの形式は –

答えて

0

あなたは、この(は、SQL Serverのでテスト)試すことができます。

:OPは彼の元のクエリを適応させる方法を知らないので、同じように簡単です

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; 

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

はい、私の例では、テクニックを見せてくれました。私の変数は、テーブル内の実際のカラムに置き換えることができます。 –

関連する問題