dateadd - 找到过去的日期

时间:2013-02-11 14:05:35

标签: sql sql-server dateadd

我有一个奇怪的问题,从约会减去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数据类型转换为日期时间数据类型会导致超出范围的值。

有没有人想过为什么它可能是1月(所有其他月份都没问题)会破坏我的代码?

感谢。

DS

3 个答案:

答案 0 :(得分:2)

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

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))

答案 1 :(得分: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:设置解释日期,smalldatetime,datetime,datetime2和datetimeoffset字符串的月,日和年日期部分的顺序。

SET DATEFORMAT { format | @format_var } 

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

答案 2 :(得分:0)

您的数据库中可能存在某些内容,可能是check constraint,与1月日期不同。转换似乎适用于SQL Server 2008(Fiddle)。其他可能导致问题的原因。

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