Я работаю с T-SQL в SQL Server 2000, и у меня есть таблица TRANSACTIONS
, в которой есть столбец даты TRANDATE
, определенный как DateTime, среди многих других столбцов, которые не имеют отношения к этому вопросу.
Таблица заполнена транзакциями за многие годы. Я столкнулся с кодом, тестом, который меня смутил. Есть простой SELECT
, например:
SELECT TRANDATE, RECEIPTNUMBER FROM TRANSACTIONS WHERE TRANDATE BETWEEN '12/01/2010' and '12/31/2010' ORDER BY TRANDATE
и он не возвращает две строки данных, которые, как я знаю, находятся в этой таблице.
С приведенным выше оператором последняя возвращаемая строка по порядку имеет TRANDATE
из: 2010-12-31 00:00:00.000
Когда я изменяю оператор, как показано ниже, я получаю две дополнительные строки за декабрь 2010 года, которые есть в этой таблице:
SELECT TRANDATE, RECEIPTNUMBER FROM TRANSACTIONS WHERE TRANDATE BETWEEN '12/01/2010 00:00:00' and '12/31/2010 23:59:59' ORDER BY TRANDATE
Я попытался выяснить, почему оператор BETWEEN
не включает ВСЕ строки за 24 периода 31.12.2010 при использовании первого SELECT
выше. И почему к оператору SELECT
нужно добавлять явные часы, как во втором, модифицированном, операторе, чтобы заставить его извлекать правильное количество строк?
Это из-за того, что TRANDATE
определяется как "DATETIME
"?
Основываясь на этом выводе, я думаю, что мне придется просмотреть весь этот старый код, потому что эти операторы BETWEEN
разбросаны по всей этой старой системе, и кажется, что она не извлекает все данные должным образом. Я просто хотел сначала разъяснений от некоторых людей. Спасибо!
'12/31/2010 23:59:59'
по-прежнему будет пропускать время между12/31/2010 23:59:59
и12/31/2010 23:59:59:997
. Не используйтеbetween
для даты и времени, используйте вместо этого>= and <
. - person Martin Smith   schedule 25.03.2011