【问题标题】:Setting sql date format设置sql日期格式
【发布时间】:2014-09-22 20:57:11
【问题描述】:

我无法弄清楚发生了什么变化,只是开始出现此错误

The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.

我检查了 SQL Server 实例的语言是“英式英语” 我检查了用户的语言是“英式英语”

我错过了什么?

select * from table where updated <= '15/09/2012'

如果我运行 set dateformat dmy,它可以工作,但显然只在会话级别。我需要为服务器修复它

【问题讨论】:

  • SET DATEFORMAT 或使用格式 yyyy-mm-dd
  • 您是否可以选择显式转换您的日期文字?即更改 SQL 语法
  • 但是为什么要使用那种格式和 (a) 不是 alawys 工作的 ISO 格式或 (b) 使用参数
  • 你试过where updated &lt;= '2012-09-15'
  • 如果你以这种格式传递日期怎么办 - 2012-09-15

标签: sql sql-server


【解决方案1】:

消除所有歧义的更好方法是对所有日期使用 ISO 8601 格式 - 2012-09-15。无论您的区域设置如何,这都将起作用。

【讨论】:

  • 虽然可能是对的,但这并不是特别有用 - 这将涉及重写相当多的代码,它只需要暂时工作......
  • 你可以做对,也可以做两次。哪个更贵?
  • 我不确定为什么我的问题本身会受到质疑......目前,做两次更昂贵。没有预算可供某人浏览代码库并替换所有日期实例。这是一个继承的代码库,构建得不是很好
  • 更好的选择是使用参数化查询而不是传递日期文字。这避免了日期格式的丑陋,更安全,并提供了性能优势。
  • 因为您想象中的解决方案只是一种创可贴,而且很弱。您无法保证您提出的解决方案不会导致 其他 查询出现问题。 OTOH,ISO 格式建议(您现在已经得到了 4 次)适用于所有情况。 修复根本原因 - 模糊的日期解释。
【解决方案2】:

select * from table where convert(date,updated,105) &lt;= '15/09/2012'

你能检查上面的查询吗?我希望它会起作用。

 declare @updated date = GetDate()

 select 
 case when (convert(date,'15/09/2012', 105) <= @updated) then 1
 else 2 end

这个查询给出 1 作为输出,所以我想它也适用于你的情况。

【讨论】:

    猜你喜欢
    • 2018-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-25
    • 1970-01-01
    • 1970-01-01
    • 2013-01-21
    • 1970-01-01
    相关资源
    最近更新 更多