我有一个带有硬编码日期的查询,格式为
startdate >= '2012-11-03' AND enddate <= '2012-11-30 23:59'
我的数据库日期格式为'mdy',但我确定它会接受yyyy-mm-dd作为其通用日期结构。
当我尝试在与特定数据库用户(userX)连接的目标数据库的SSMS中运行此查询时,我收到有关日期格式的错误
Msg 242,Level 16,State 3,Line 1
将varchar数据类型转换为日期时间数据类型会导致超出范围的值。
但是,当我运行以SA用户身份连接的确切查询时,查询将执行..
这是为什么?我已经给了userX完整的dbo权限(系统管理员等)并仍然得到错误?
答案 0 :(得分:3)
如果您需要使用字符串指定日期时间,则应使用安全,与语言无关的格式。
在SQL Server中,这是ISO-8601格式(略微适应),它基本上支持两种始终有效的DATETIME
安全格式 - 无论您的语言,区域和日期格式设置如何:
YYYYMMDD (e.g. 20121231 for 31st of December 2012) if you need date only
YYYY-MM-DDTHH:mm:ss (e.g. 2012-12-31T21:05:00 for 31st of December 2012, 9:05pm)
注意:
第一个仅限日期的格式为无破折号或分隔符!
第二种格式有日期的破折号(也可以省略),并且在字符串的日期和时间部分之间有一个固定的T
作为分隔符
更新(关于两位用户的不同默认语言) - 试试这个:
-- this is how your `SA` interprets the string as datetime....
SET LANGUAGE english
SELECT CAST('2012-11-30 23:59' AS DATETIME)
工作得很好......
-- this is how your British user interprets teh string as datetime
SET LANGUAGE british
SELECT CAST('2012-11-30 23:59' AS DATETIME)
Msg 242,Level 16,State 3,Line 7
将varchar数据类型转换为日期时间数据类型会导致超出范围的值。
这会尝试将字符串解释为 2012年第30个月的第11个,显然,这会失败......
答案 1 :(得分:0)
考虑使用
startdate&gt; ='2012-11-03'ANDdate&lt; '2012年12月1日'
代替