4

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

startdate >= '2012-11-03' AND enddate <= '2012-11-30 23:59'

我的数据库日期格式是“mdy”,但我确定它会接受 yyyy-mm-dd 作为其通用日期结构。

当我尝试在与特定数据库用户 (userX) 连接的目标数据库上的 SSMS 中运行此查询时,我收到有关日期格式的错误

消息 242,级别 16,状态 3,第 1 行
将 varchar 数据类型转换为 datetime 数据类型导致值超出范围。

但是,当我运行作为 SA 用户连接的确切查询时,查询会执行..

为什么是这样?我已授予 userX 完整的 dbo 权限(sysadmin 等),但仍然出现错误?

4

2 回答 2

4

如果您需要使用字符串指定日期时间,则应使用安全的、与语言无关的格式。

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

消息 242,级别 16,状态 3,第 7 行
将 varchar 数据类型转换为 datetime 数据类型导致值超出范围。

这试图将字符串解释为2012 年第 30 个月的 11 日,显然,这失败了......

于 2012-12-12T17:30:27.267 回答
0

考虑使用

开始日期 >= '2012-11-03' AND 结束日期 < '2012-12-01'

反而

于 2012-12-12T17:32:55.057 回答