我有一个奇怪的问题,从约会减去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
答案 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)。其他可能导致问题的原因。
另外,其他人提供的日期格式化建议是很好的建议。