月份从日期返回不正确的值

时间:2016-11-24 18:04:18

标签: sql sql-server tsql datetime sql-server-2005

下午,

我遇到了一个SQL服务器的问题,我可以帮忙解决这个问题。 当我运行一个带有日期范围的select语句时,它返回错误日期范围内的行。

e.g。如果我执行以下

select * from theTable where startDate between '2016-09-01 00:00:00' and '2016-09-08 23:59:59'

我希望startDate在9月1日到8日之间的行,我实际得到的是1月9日到8月9日之间startDate行的行。

我使用以下方法检查了我为日期库设置的语言:

select * from sys.syslanguages order by name where name = @@language

返回英国

DBCC useroptions返回

textsize             2147483647
language             British
dateformat           dmy
datefirst            1
lock_timeout         -1
quoted_identifier    SET
arithabort           SET
ansi_null_dflt_on    SET
ansi_warnings        SET
ansi_padding         SET
ansi_nulls           SET
concat_null_yields_null  SET
isolation level          read committed

我已经检查了登录的默认语言,这也是英国人。

执行print month('2016-09-01 00:00:00')

它返回1而不是9.除非我弄错了,上面的日期和时间应该是ODBC规范yyyy-mm-dd hh:mi:ss(24h)

为什么打印1而不是9,更重要的是如何修复它?

打印@@version返回

Microsoft SQL Server 2005 - 9.00.5057.00 (X64) 
    Mar 25 2011 13:33:31 
    Copyright (c) 1988-2005 Microsoft Corporation
    Enterprise Edition (64-bit) on Windows NT 5.2 (Build 3790: Service Pack 2)

感谢您的帮助。 如果已经回答了这个问题,你可以指点我,只有我找不到答案。

2 个答案:

答案 0 :(得分:2)

您似乎有一个相对不寻常的国际化设置,默认为YDM而不是YMD。

您始终可以使用不带连字符的日期:

select *
from theTable
where startDate >= '20160901' and
      startDate < '20160909';

这些总是在SQL Server中被解释为YYYYMMDD。

答案 1 :(得分:-1)

如果您在评估地点条件时也需要考虑时间戳,请尝试将日期转换为:

CONVERT(datetime,'2016-09-01 00:00:00',101)

所以你的查询将成为:

select * from theTable 
where startDate between 
CONVERT(datetime,'2016-09-01 00:00:00',101) 
and 
CONVERT(datetime,'2016-09-08 23:59:59',101)

这样你的月份将是[9]而不是[1],也会考虑时间戳。