Сравнение дат в SQL
У меня есть таблица с датами, которые все произошло в ноябре месяце.
Я написал этот запрос
select id,numbers_from,created_date,amount_numbers,SMS_text
from Test_Table
where
created_date <= '2013-04-12'
Этот запрос должен вернуть все, что произошло в месяце 11 (ноябрь), потому что это произошло до дата "2013-04-12" (в декабре)
Но это только возврат доступных дат, которые происходили в дни меньше 04 (2013- 04 -12)
Может быть, это только сравнение дневной части? а не всю дату?
Как это исправить?
Created_date имеет тип date
Формат даты по умолчанию yyyy-dd-MM
Ответы
Ответ 1
Вместо "2013-04-12", значение которого зависит от местной культуры, используйте "20130412", который распознается как формат инварианта культуры.
Если вы хотите сравнить с 4 декабря th вы должны написать '20131204'. Если вы хотите сравнить с 12 апреля th вы должны написать '20130412'.
В статье Запись международных операторов Transact-SQL из документации SQL Server объясняется, как писать операторы, которые являются инвариантами для культуры:
Приложения, использующие другие API, или скрипты Transact-SQL, хранимые процедуры и триггеры, должны использовать несепаратированные числовые строки. Например, yyyymmdd как 19980924.
ИЗМЕНИТЬ
Поскольку вы используете ADO, лучшим вариантом является параметризация запроса и передача значения даты в качестве параметра даты. Таким образом, вы полностью исключаете проблему формата и получаете преимущества производительности параметризованных запросов.
UPDATE
Чтобы использовать формат ISO 8601 в литерале, необходимо указать все элементы. Чтобы процитировать из раздела документации ISO datetime ISO 8601
Чтобы использовать формат ISO 8601, вы должны указать каждый элемент в формате. Это также включает в себя T, двоеточия (:) и период (.), Которые показаны в формате.
... доля второго компонента не является обязательной. Компонент времени указан в 24-часовом формате.
Ответ 2
Попробуйте это
select id,numbers_from,created_date,amount_numbers,SMS_text
from Test_Table
where
created_date <= '2013-12-04'
Ответ 3
Вы помещаете <=
, и он тоже поймает данную дату. Вы можете заменить его только <
.
Ответ 4
попробуйте выполнить ниже запрос
select id,numbers_from,created_date,amount_numbers,SMS_text
from Test_Table
where
convert(datetime, convert(varchar(10), created_date, 102)) <= convert(datetime,'2013-04-12')
Ответ 5
Если вы сравниваете только с датой, то преобразование его на дату (не datetime) будет работать
select id,numbers_from,created_date,amount_numbers,SMS_text
from Test_Table
where
created_date <= convert(date,'2013-04-12',102)
Это преобразование также применимо при использовании функции GetDate()
Ответ 6
Попробуйте использовать "#" до и после даты и не забудьте указать формат вашей системной даты. возможно, "YYYYMMDD O YYYY-MM-DD O MM-DD-YYYY O ИСПОЛЬЗОВАНИЕ '/O \'"
Пример:
select id,numbers_from,created_date,amount_numbers,SMS_text
from Test_Table
where
created_date <= #2013-04-12#
Ответ 7
Формат даты - yyyy-mm-dd.
Таким образом, вышеупомянутый запрос ищет записи старше 12Apr2013
Предложите вам выполнить быструю проверку, установив строку даты на "2013-04-30", если нет ошибки sql, формат даты подтвержден до yyyy-mm-dd.