SQL Server日期格式用户依赖?

时间:2012-12-12 17:04:09

标签: sql-server sql-server-2008

我有一个带有硬编码日期的查询,格式为

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权限(系统管理员等)并仍然得到错误?

2 个答案:

答案 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日'

代替