0

从日期中减去 18 个月,我遇到了一个奇怪的问题。考虑以下代码段:

Convert(dateTime,CREATION_DATE,103) > 
    DateAdd (MONTH, -18, Convert (DateTime, @IN_ACTIVITY_DATE, 103))

这构成了存储过程中 where 子句的一部分。当我运行时:

exec theSP @IN_ACTIVITY_DATE = '21/02/2013'

它运行良好,但是当我将其更改为:

exec theSP @IN_ACTIVITY_DATE = '21/01/2013'

它因错误而中断:

将 varchar 数据类型转换为 datetime 数据类型导致值超出范围。

有没有人对为什么可能是一月(所有其他月份都可以)破坏我的代码有任何想法?

谢谢。

DS

4

3 回答 3

2

将字符串作为日期时间传递,使用ISO formatyyyymmdd保证可以在具有任何文化信息的任何服务器中工作。;

exec theSP @IN_ACTIVITY_DATE = '20130121'

另外作为旁注, 如果CREATION_DATE已经存在,datetime则无需CONVERT CREATION_DATE进行比较。

--if CREATION_DATE is DATETIME/DATE column
CREATION_DATE > 
DateAdd (MONTH, -18, Convert (DateTime, @IN_ACTIVITY_DATE))
于 2013-02-11T14:11:15.667 回答
0

以YYYY-MM-DD格式指定日期。

例如。:

exec theSP @IN_ACTIVITY_DATE = '2013-01-21'

此外,您可以使用SET DATEFORMAT指定日期格式:

例如。:

SET DATEFORMAT dmy;
exec theSP @IN_ACTIVITY_DATE = '21/02/2013'
exec theSP @IN_ACTIVITY_DATE = '21/01/2013'

SET DATEFORMAT:为解释 date、smalldatetime、datetime、datetime2 和 datetimeoffset 字符串设置月、日和年日期部分的顺序。

SET DATEFORMAT { format | @format_var } 

格式 | @format_var:是日期部分的顺序。有效参数是mdy、dmy、ymd、ydm、myd 和 dym

于 2013-02-11T14:18:38.967 回答
0

您的数据库中可能有一些check constraint不喜欢一月日期的东西,也许是 a。转换为似乎适用于 SQL Server 2008 ( Fiddle )。其他可能导致问题的原因。

此外,其他人提供的日期格式建议是很好的建议。

于 2013-02-11T14:28:07.867 回答