Sql server 无法构造数据类型date,某些参数的值无效

Sql server 无法构造数据类型date,某些参数的值无效,sql-server,tsql,date,sql-server-2012,case,Sql Server,Tsql,Date,Sql Server 2012,Case,我的数据库中有一个日期,它不应该包括年份,因此我需要通过检查日期来构造正确的日期。(如果日期今年还未到,我想定在2017年,如果日期已经过去,我想定在2018年) (t.myDate是可为空的日期时间) 我如何发现数据质量问题,以及如何解决它 (我使用的是SQL Server 2012)除了检查空值之外,2月29日也可能有问题。例如,如果您有日期2016-02-29,并且您试图构建日期2017-02-29,您将得到上述错误,因为这不是一个有效的日期 通常,您可以使用游标在记录上循环,并在TRY/

我的数据库中有一个日期,它不应该包括年份,因此我需要通过检查日期来构造正确的日期。(如果日期今年还未到,我想定在2017年,如果日期已经过去,我想定在2018年) (t.myDate是可为空的日期时间)

我如何发现数据质量问题,以及如何解决它


(我使用的是SQL Server 2012)

除了检查空值之外,2月29日也可能有问题。例如,如果您有日期
2016-02-29
,并且您试图构建日期
2017-02-29
,您将得到上述错误,因为这不是一个有效的日期


通常,您可以使用游标在记录上循环,并在
TRY/CATCH
中执行逻辑。在异常情况下,您可以打印有问题的数据并检查问题所在。

谢谢,我会尝试检查是否存在问题是的,它成功了!添加以下内容作为第一个CASE子句修复了它:WHEN(DATEPART(MONTH,t.myDate)=2和DATEPART(DAY,t.myDate)=29),然后DATEFROMPARTS('2018',DATEPART(MONTH,t.myDate),DATEPART(DAY,DATEADD(DAY,-1,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
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
WHERE t.myDate IS NOT NULL