2017-10-14 67 views
0

我的数据库中有一个日期,它不应该包含年份,所以我需要通过检查日期来构造正确的日期。 (如果日期尚未今年来,我要定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)

回答

1

除了检查NULL你也可能有问题,今年2月29日。例如,如果您的日期为2016-02-29,并且您正在尝试构建日期2017-02-29,您将收到上述错误,因为这不是有效的日期。

一般而言,您可以使用光标循环记录并在TRY/CATCH内执行您的逻辑。在例外情况下,您可以打印违规数据并检查问题所在。

+0

谢谢,我会尝试检查 – Skywise

+0

是的,它的工作!添加以下作为第一个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

相关问题