2016-11-24 2 views
2

Вторая половина дня,Месяц возвращает неправильное значение с даты

У меня проблема с SQL-сервером, с которой я мог бы справиться с некоторой помощью. Когда я запускаю оператор select с диапазоном дат в том месте, где он возвращает строки из неправильного диапазона дат.

например. Если я выполнить следующие

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

Я бы ожидать строки, где startDate находится между 1-й и 8-го сентября, что я на самом деле получаю строки с startDate между 9 января и 9-го августа.

Я проверил язык у меня есть установка на для datebase с помощью:

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

Используйте однозначный формат ('YYYYMMDD'):' где startDate> = '20160901' и startDate <'20160909'' – Lamak

ответ

2

У вас будет относительно необычная интернационализация, где по умолчанию используется YDM, а не YMD.

Вы всегда можете использовать даты без дефиса:

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

Это всегда истолковано как ГГГГММДД в ​​SQL Server.

+0

Действительно. Настройка французского языка, чтобы выбрать общий пример, будет интерпретировать «2016-09-01 00:00:00» 9 января 2016 года. –

-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], а также отметка времени.

Смежные вопросы