Запрос сравнения дат в 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

Формат даты по умолчанию гггг-дд-мм

11 ответов

Решение

Вместо "2013-04-12", значение которого зависит от местной культуры, используйте "20130412", который считается форматом, инвариантным к культуре.

Если вы хотите сравнить с 4 декабря, вы должны написать "20131204". Если вы хотите сравнить с 12 апреля, напишите "20130412".

В статье "Создание международных операторов Transact-SQL из документации по SQL Server" объясняется, как писать операторы, инвариантные к культуре:

Приложения, которые используют другие API или скрипты Transact-SQL, хранимые процедуры и триггеры, должны использовать неразделенные числовые строки. Например, ггггммдд как 19980924.

РЕДАКТИРОВАТЬ

Поскольку вы используете ADO, лучшим вариантом является параметризация запроса и передача значения даты в качестве параметра даты. Таким образом, вы полностью избегаете проблем с форматированием и получаете преимущества в производительности от параметризованных запросов.

ОБНОВИТЬ

Чтобы использовать формат ISO 8601 в литерале, должны быть указаны все элементы. Цитировать из раздела ISO 8601 документации datetime

Чтобы использовать формат ISO 8601, необходимо указать каждый элемент в формате. Это также включает T, двоеточия (:) и точку (.), Которые отображаются в формате.

... доля второго компонента необязательна. Компонент времени указывается в 24-часовом формате.

Попробуй вот так

select id,numbers_from,created_date,amount_numbers,SMS_text 
from Test_Table
where 
created_date <= '2013-12-04'

Если вы сравниваете только с датой вейл, то конвертация в дату (а не в дату-время) будет работать

select id,numbers_from,created_date,amount_numbers,SMS_text 
 from Test_Table
 where 
 created_date <= convert(date,'2013-04-12',102)

Это преобразование также применимо во время использования функции GetDate()

Пожалуйста, попробуйте с запросом ниже

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')

Вы положили <= и он поймает данную дату тоже. Вы можете заменить его на < только.

Попробуйте использовать "#" до и после даты и убедитесь, что вы используете системный формат даты. возможно "ГГГГММДД О ГГГГ-ММ-ДД О ММ-ДД-ГГГГ О ИСПОЛЬЗОВАНИЕ '/ O \' "

Пример:

 select id,numbers_from,created_date,amount_numbers,SMS_text 
 from Test_Table
 where 
 created_date <= #2013-04-12#

Преобразуйте их в даты в том же формате, а затем вы сможете сравнить. Попробуйте вот так:

      where convert(date, created_date,102) <= convert(date,                                  /*102 is ANSI format*/
                                                    substring('2013-04-12',1,4) + '.' + /*year*/
                                                    substring('2013-04-12',9,2) + '.' + /*month*/
                                                    substring('2013-04-12',6,2)         /*day*/
                                                ,102)

Для моих запросов в MS Access я могу сравнивать даты с помощью этого синтаксиса:

      SELECT COUNT(orderNumber) AS Total
FROM Orders
WHERE orderDate >=#2003/04/01#
AND orderDate <=#2003/06/30#;

Где выход — количество заказов между 2003-04-01 и 2003-06-30.

Формат даты: гггг-мм-дд. Таким образом, приведенный выше запрос ищет записи старше 12 апреля 2013 г.

Предлагаем сделать быструю проверку, установив строку даты в '2013-04-30', если нет ошибки sql, формат даты подтверждается как yyyy-mm-dd.

вы также можете использовать to_char(column_name, 'YYYY-MM-DD), чтобы изменить формат

Нижеприведенный запрос можно использовать для поиска записей месяца ноябрь за 2013 год.

      Select id,numbers_from,created_date,amount_numbers,SMS_text 
from Test_Table
where Month(created_date) = 11 and Year(created_date) = 2013
Другие вопросы по тегам