将2个日期与diff数据类型进行比较

时间:2017-11-02 21:17:16

标签: sql sql-server sql-server-2012

我有 temp_table ,如果 Create_date 是未来日期,我必须将状态更新为无效日期。 以下是我正在使用的更新声明:

Set dateformat dmy
UPDATE [Temp_table] 
SET [Status]= 'InvalidCreateDate-Rejected' 
WHERE CAST(Create_date AS DATETIME) >=getdate() and isdate(create_date)=1

但每当我执行它时,我都收到错误消息:

  

Msg 242,Level 16,State 3,Line 1 varchar数据的转换   键入日期时间数据类型会导致超出范围的值。该   声明已被终止。

我尝试以差异格式转换 Getdate Create_date ,然后比较了相同的问题。

示例Create_Dates: 1800年5月15日 04/06/2011 23/04/2015 13/08/2016 2017年2月21日 15/06/2017

对此有任何解决方案吗?

2 个答案:

答案 0 :(得分:0)

您的create_date演员表遇到无效日期并导致错误。 is_date函数是一个好主意,但它不会阻止强制转换之前发生错误。

Set dateformat dmy
UPDATE [Temp_table] 
SET [Status]= 'InvalidCreateDate-Rejected' 
WHERE CAST(case when  isdate(create_date)=1 then Create_date else null AS DATETIME) >=getdate() 

如果null导致问题,您可以有目的地使用过去的日期而不是null,但是将日期转换为null并将其与日期进行比较应该导致false并将其从结果中删除

答案 1 :(得分:0)

但是,您可以使用可以处理不同日期格式的case表达式

SELECT CONVERT(DATETIME, Create_Dates,
                         CASE
                             WHEN CAST(SUBSTRING(Create_Dates, 4, 2) AS INT) > 12
                             THEN 101
                             ELSE 103
                         END);

结果: -

1800-05-15 00:00:00.000
2011-06-04 00:00:00.000
2015-04-23 00:00:00.000
2016-08-13 00:00:00.000
2017-02-21 00:00:00.000
2017-06-15 00:00:00.000