【问题标题】:Converting alphanumeric to a date type and using DATEDIFF将字母数字转换为日期类型并使用 DATEDIFF
【发布时间】:2017-04-15 04:13:52
【问题描述】:

我有以下疑问:

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。

【问题讨论】:

  • 您有 NVAL 和 OVAL 的示例吗?它们是否总是格式化为:MM/DD/YYYY?
  • DD/MM/YYYY 是格式

标签: sql-server tsql date sql-server-2012 datediff


【解决方案1】:

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);

【讨论】:

  • 感谢您的回复。我理解这个概念,但是如果不输入确切日期等文字值,这将如何工作?
  • 是的,我的示例更多地是向您展示一种技术。您可以用表格中的真实列替换我的变量。
【解决方案2】:

你可以试试这个(在 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 

【讨论】:

  • 感谢您的回复。我理解这个概念,但是如果不输入确切日期等文字值,这将如何工作?
  • 只需在您的查询中将@DATE2 替换为NVAL_0@DATE1OVAL_0 :)
猜你喜欢
  • 2021-02-24
  • 2018-09-30
  • 1970-01-01
  • 2020-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-10
  • 1970-01-01
相关资源
最近更新 更多