【问题标题】:SQL Server date Format user dependent?SQL Server 日期格式用户依赖?
【发布时间】:2012-12-13 17:21:42
【问题描述】:

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

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 等),但仍然出现错误?

【问题讨论】:

  • 不确定一个用户不工作的原因是什么。但是,ISO 日期格式yyyymmddISO8601 格式yyyy-mm-ddThh:mi:ss.mmm。尝试使用它们,看看是否仍然出现错误。

标签: sql-server sql-server-2008


【解决方案1】:

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

在 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 个月,显然,这失败了......

【讨论】:

  • 嗨,Marc,感谢您的回答,因为它确实有效,但是我很困惑我的第一个日期字符串不适用于一个用户,但它们适用于 SA 用户?
  • @davey: SA 和其他用户是否有相同的语言设置?
  • @davey:在 SQL Server Mgmt Studio 中,在 Object Explorer &gt; (your server) &gt; Security &gt; Logins 中,然后查看有问题的两个登录名(SA 和您的其他用户) - 他们的 Default language 设置为什么? ?
  • Ahhh .. 刚刚发现,sa 只是英语,其他用户是英国英语,我将交换并报告回来.. 就这样......大坝恨自己没有看到这一点。谢谢马克
【解决方案2】:

考虑使用

开始日期 >= '2012-11-03' 和结束日期

改为

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-14
    • 2017-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-23
    • 2011-10-05
    相关资源
    最近更新 更多