У меня есть такой запрос:
SELECT * FROM Cases WHERE created_at BETWEEN '2013-05-01' AND '2013-05-01'
Но это не дает результатов, хотя есть данные по 1-му.
created_at
похоже 2013-05-01 22:25:19
, я подозреваю, что это связано со временем? Как это можно решить?
Это работает очень хорошо, если я делаю большие диапазоны дат, но оно должно (включительно) работать с одной датой тоже.
sql
sql-server
sql-server-2008
tsql
date
JBurace
источник
источник
Ответы:
Это является включительно. Вы сравниваете даты и даты. Вторая дата интерпретируется как полночь, когда день начинается .
Один из способов исправить это:
Еще один способ исправить это с помощью явных двоичных сравнений
Аарон Бертран имеет длинную запись в блоге о датах ( здесь ), где он обсуждает эту и другие проблемы с датами.
источник
dateadd
его на следующий день.set dateformat dmy;select month(cast('2013-05-01' as datetime)); =1
>=
) и открытый в другом (<
), в сочетании с проверкой на один день после указанной конечной даты.where
предложении, поскольку он потеряет все имеющиеся у него индексации. Это действительно плохая модель.Предполагалось, что вторая ссылка на дату в
BETWEEN
синтаксисе волшебным образом считается «концом дня», но это не соответствует действительности .то есть это было ожидаемо:
но то, что действительно происходит, это:
Что становится эквивалентом:
Проблема в том , один из восприятий / ожидания о
BETWEEN
которых действительно включают как нижнее значение и верхние значения в диапазоне, но не волшебно сделать дату «начала» или «конец».BETWEEN
следует избегать при фильтрации по диапазонам дат.Всегда используйте
>= AND <
вместокруглые скобки здесь необязательны, но могут быть важны в более сложных запросах.
источник
Вам нужно сделать один из этих двух вариантов:
between
состояние:... where created_at between '2013-05-01 00:00:00' and '2013-05-01 23:59:59'
(не рекомендуется ... см. Последний абзац)between
. Обратите внимание, что тогда вам придется добавить один день ко второму значению:... where (created_at >= '2013-05-01' and created_at < '2013-05-02')
Мои личные предпочтения - второй вариант. Кроме того, Аарон Бертран имеет очень четкое объяснение того, почему его следует использовать.
источник
BETWEEN
для запросов диапазона дат, которые включают время; слишком много может пойти не так.Просто используйте отметку времени в качестве даты:
источник
'DATE' is not a recognized built-in function name.
нужно конвертировать stackoverflow.com/a/20973452/4233593Я считаю, что лучшим решением для сравнения поля даты и времени с полем даты является следующее:
Это эквивалентно инклюзивному утверждению между, поскольку оно включает как дату начала и окончания, так и те, которые попадают между ними.
источник
Это будет работать только в 2008 году и более новых версиях SQL Server
Если вы используете старую версию, используйте
источник
convert(varchar, created_at, 101)
результат, какdd/MM/yyyy
и строки OPyyyy-MM-dd
, я думаю, что этот ответ не будет работать;).Вы можете использовать
date()
функцию, которая извлечет дату из даты и времени и выдаст вам результат как включающую дату:источник
Дямская дата между запросами sql
источник