【问题标题】:Datetime issue with stored procedure in SQL ServerSQL Server 中存储过程的日期时间问题
【发布时间】:2012-03-01 10:43:11
【问题描述】:

以下代码在被代码执行时似乎没有运行:

存储过程sn-p:

Click to view full SP

 AND (@month_ref = 81201 
      AND tsks.grouping_ref = @grouping_ref 
      AND ts.start_dtm BETWEEN convert(datetime, '2011-11-28') 
                           AND convert(datetime,'2012-01-01')
     )
  OR (@month_ref = 81202 
      AND tsks.grouping_ref = @grouping_ref 
      AND ts.start_dtm BETWEEN convert(datetime,'2012-01-02') 
                           AND convert(datetime,'2012-01-29')
     )...

服务器设置:

SQL Server 设置为:

  • 语言:英语(美国)

并且 Windows Server 区域和语言设置为:

  • 英语(美国)

我们的测试服务器是为英式英语设置的,存储过程似乎可以正常工作。我感觉客户设置不喜欢日期。

数据库设计/数据

ts.start_dtm 在数据库中看起来像这样:

  • 数据类型 - 日期时间

    2011-04-01 00:00:00.000
    

所以它的设置为 - YEAR | MONTH | DATE

我的存储过程将start_dtm 硬编码为'2012-01-02',格式也相同。

你能帮帮我吗?

问题是网站在尝试运行存储过程时失败。问题是数据转换。我必须指定日期转换的格式。

【问题讨论】:

  • 如果你跳过转换的东西会发生什么?
  • 我的问题仍然存在...... :(
  • 您实际上并没有说出您遇到了什么错误/问题 - 您能否更新问题以添加此内容?
  • 你是说英国的设置有效吗? set language british; select cast('2011-11-28' as datetime) 应该失败,us_english 应该成功
  • 实际上,YYYY-MM-DD 格式确实 NOT 在 SQL Server 中工作 - 例如与“英式英语”。您需要改用YYYYMMDD没有破折号!)才能真正独立于语言。

标签: sql sql-server sql-server-2008 tsql stored-procedures


【解决方案1】:

您根本不需要对日期进行显式转换。这是 ISO8601 格式,所以数据库应该可以直接理解:

ts.start_dtm Between '2011-11-28' AND '2012-01-01'

如果您需要转换它们,请指定您对字符串使用的格式:

ts.start_dtm Between convert(datetime,'2011-11-28', 120) AND convert(datetime,'2012-01-01', 120)

【讨论】:

  • 这解决了这个问题。我仍然想知道当格式已经是 ISO 标准时为什么我需要 120?我看到 120 是指“ODBC 规范 - yyyy-mm-dd hh:mi:ss(24h)”
  • @sp-1986:当您使用convert 将字符串转换为日期时,它具有默认格式,因此通过不指定格式,您隐含地告诉方法尝试将字符串解析为mon dd yyyy 格式。
  • @Guffa:我通过提供 120 格式年份看到了这一点 |月 |正确转换的日期。谢谢你今天学到了很多!
  • 实际上,YYYY-MM-DD 格式在 SQL Server 中工作 - 您需要改用 YYYYMMDD没有破折号! )。
猜你喜欢
  • 2011-01-25
  • 1970-01-01
  • 1970-01-01
  • 2013-10-01
  • 2011-09-06
  • 2011-11-07
  • 2012-04-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多