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