T-SQL запрос с диапазоном дат - PullRequest
3 голосов
/ 19 мая 2010

У меня довольно странная «ошибка» с простым запросом, и я смутно помню, как читал причину этого где-то давным-давно, но хотел бы, чтобы кто-нибудь освежил мою память.

Таблица является базовойИдентификатор, таблица Datetime.

Запрос:

select ID, Datetime from Table where Datetime <= '2010-03-31 23:59:59'

Проблема заключается в том, что результаты запроса включают результаты, где Datetime равно '2010-04-01 00:00:00'.На следующий день.Что это не должно.

Кто-нибудь?

Приветствия

Му

Ответы [ 3 ]

7 голосов
/ 19 мая 2010

Взгляните на Как хранятся даты в SQL Server? и Как работает между датами в SQL Server?

Если это маленькое время, оно имеет 1-минутную точность, поэтому, если округлено, для даты-времени это 300 миллисекунд

пример

DECLARE @d DATETIME
SELECT @d = '2001-12-31 23:59:59.999'

SELECT @d

2002-01-01 00: 00: 00.000

DECLARE @d DATETIME
SELECT @d = '2001-12-31 23:59:59.998'

SELECT @d

2001-12-31 23: 59: 59,997

Всегда используйте меньше, чем на следующий день в полночь, в вашем случае

< '20100401'
3 голосов
/ 19 мая 2010

попробуйте сделать это так:

select ID, Datetime from Table where Datetime < '2010-04-01'

Я всегда задаю дату и время, но просто использую "<" меньше, чем. </p>

для использования даты и времени в дневное время:

SELECT DATEADD(day,DATEDIFF(day,0,  GETDATE()   ),0) 

Вы можете легко увеличить дату и время, используя сложение:

SELECT GETDATE()+1

с помощью '23: 59: 59 'вы можете пропустить строки, попробуйте:

DECLARE @YourTable table (RowID int, DateOf datetime)
INSERT INTO @YourTable VALUES (1,'2010-03-31 10:00')
INSERT INTO @YourTable VALUES (2,'2010-03-31')
INSERT INTO @YourTable VALUES (3,'2010-03-31 23:59:59')
INSERT INTO @YourTable VALUES (4,'2010-03-31 23:59:59.887')
INSERT INTO @YourTable VALUES (5,'2010-04-01')
INSERT INTO @YourTable VALUES (6,'2010-04-01 10:00')
select * from @YourTable where DateOf <= '2010-03-31 23:59:59'

OUTPUT

RowID       DateOf
----------- -----------------------
1           2010-03-31 10:00:00.000
2           2010-03-31 00:00:00.000
3           2010-03-31 23:59:59.000

(3 row(s) affected

этот запрос неверен, поскольку он не находит пропущенную запись rowID = 4.

если вы попытаетесь исправить это с помощью:

select * from @YourTable where DateOf <= '2010-03-31 23:59:59.999'

тогда будет включен RowID = 5, что неверно.

3 голосов
/ 19 мая 2010

Очень странно, что вы это видите; Я не знаю почему. Но я предлагаю вам написать запрос следующим образом:

select ID, Datetime from Table where Datetime < '2010-04-01'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...