2012-03-01 53 views
1

当代码执行下面的代码不会出现运行:日期时间问题与SQL Server存储过程

存储过程的代码片段:

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区域和语言设置为:

  • 英语(美国)

我们的测试服务器设置为英国英文和存储过程似乎工作得很好。我有一种感觉,客户设置不喜欢日期。

DB设计/数据

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

  • 数据类型 - 日期时间

    2011-04-01 00:00:00.000 
    

所以其设置为 - YEAR | MONTH | DATE

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

你能帮助我吗?

问题是网站尝试运行存储过程时失败。问题是数据转换。我不得不分配日期转换的格式。

+0

会发生什么转换的东西? – 2012-03-01 10:45:44

+0

我的问题将仍然存在...... :( – 2012-03-01 10:47:30

+0

你还没有真正说过你得到了什么错误/问题 - 你能否更新这个问题来补充这个问题? – 2012-03-01 11:01:22

回答

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) 
+0

120意味着什么? – 2012-03-01 10:52:18

+1

120在本文的表格中解释http:// msdn.microsoft.com/en-us/library/ms187928。aspx – 2012-03-01 11:05:05

+0

这解决了这个问题。当格式已经是ISO标准时,我仍然想知道为什么我需要120?我看到120指的是“ODBC规范 - yyyy-mm-dd hh:mi:ss(24h)” – 2012-03-01 11:31:29