无法构造数据类型日期,某些参数的值无效
问题描述:
我的数据库中有一个日期,它不应该包含年份,所以我需要通过检查日期来构造正确的日期。 (如果日期尚未今年来,我要定2017年,如果日期已过,我要定2018) (t.myDate是一个可为空的日期时间)无法构造数据类型日期,某些参数的值无效
SELECT
NewDate = CASE
WHEN DATEPART(dayofyear, GETDATE()) < DATEPART(dayofyear, t.myDate)
THEN DATEFROMPARTS('2017', DATEPART(MONTH,t.myDate), DATEPART(DAY, t.myDate))
ELSE DATEFROMPARTS('2018', DATEPART(MONTH,t.myDate), DATEPART(DAY,t.myDate))
END
FROM
MyTable t
然而,在一些我收到以下错误消息:
无法构造数据类型日期,某些参数的值无效。
我不知道是什么问题,但我知道有些行是NULL。所以,我曾尝试使用CASE表达式来解决这个问题简单地使用今天的日期在哪里的问题情况:
SELECT
NewDate = CASE
WHEN t.myDate is null
THEN GETDATE()
WHEN DATEPART(MONTH,t.myDate) < 1
THEN GETDATE()
WHEN DATEPART(MONTH,t.myDate) > 12
THEN GETDATE()
WHEN DATEPART(DAY,t.myDate) < 1
THEN GETDATE()
WHEN DATEPART(DAY,t.myDate) > 31
THEN GETDATE()
WHEN ISDATE(t.myDate) = 0
THEN GETDATE()
WHEN DATEPART(dayofyear, GETDATE()) < DATEPART(dayofyear, t.myDate)
THEN DATEFROMPARTS('2017', DATEPART(MONTH,t.myDate), DATEPART(DAY, t.myDate))
ELSE DATEFROMPARTS('2018', DATEPART(MONTH,t.myDate), DATEPART(DAY,t.myDate))
END
FROM
MyTable t
但我仍然得到同样的错误。要么我正在测试错误的数据质量问题,要么CASE表达式没有按照我预期的那样工作。
另外:它不利于使用,其中对于空行子句:
WHERE t.myDate IS NOT NULL
我怎样才能找到数据的质量问题,以及如何围绕它得到什么?
(我使用SQL Server 2012)
答
除了检查NULL你也可能有问题,今年2月29日。例如,如果您的日期为2016-02-29
,并且您正在尝试构建日期2017-02-29
,您将收到上述错误,因为这不是有效的日期。
一般而言,您可以使用光标循环记录并在TRY/CATCH
内执行您的逻辑。在例外情况下,您可以打印违规数据并检查问题所在。
谢谢,我会尝试检查 – Skywise
是的,它的工作!添加以下作为第一个CASE子句修复它: 当(DATEPART(MONTH,t.myDate)= 2和DATEPART(DAY,t.myDate)= 29) \t \t THEN DATEFROMPARTS('2018',DATEPART(MONTH, t.myDate),DATEPART(DAY,DATEADD(DAY,-1,t.myDate))) – Skywise