我有 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
对此有任何解决方案吗?
答案 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