Сравнение дат в 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-04-12)
- Веселье с датами США и Великобритании на новом сервере
- даты подряд два выходных
- объединение ежемесячных значений с ежедневными значениями в sql
- Как хранить и запрашивать данные расписания?
- Как получить данные через несколько дней после определенного часа каждого дня?
Может быть, это только сравнение дневной части? а не целую дату?
Как это исправить?
Created_date имеет дату типа
Формат даты по умолчанию yyyy-dd-MM
- Отображение даты в Microsoft Dynamics CRM по сравнению с SQL Server
- Найти ближайшую дату в SQL Server
- Запрос SQL Server для преобразования плохо собранной даты в полезную дату для анализа возраста
- sql последние две записи, отфильтрованные по дате
- Почему SQL Server бросает GETDATE () в другое значение, чем CAST ('yyyy-mm-dd')?
- Как рассчитать последний день месяца в SQL?
- Поведение ISNULL на сервере sql
- SQL: Как найти уникальные диапазоны дат из заданного набора диапазонов дат?
Вместо «2013-04-12», значение которого зависит от местной культуры, используйте «20130412», который распознается как формат инварианта культуры.
Если вы хотите сравнить с 4 декабря, вы должны написать '20131204'. Если вы хотите сравнить с 12 апреля, вы должны написать '20130412'.
Статья « Запись международных операторов Transact-SQL из документации SQL Server» объясняет, как писать операторы, которые являются инвариантами для культуры:
Приложения, использующие другие API, или скрипты Transact-SQL, хранимые процедуры и триггеры, должны использовать несепаратированные числовые строки. Например, yyyymmdd как 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'
Вы помещаете <=
и он тоже поймает данную дату. Вы можете заменить его на <
only.
попробуйте выполнить ниже запрос
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')
Если вы сравниваете только с датой, то преобразование ее на дату (а не datetime ) будет работать
select id,numbers_from,created_date,amount_numbers,SMS_text from Test_Table where created_date <= convert(date,'2013-04-12',102)
Это преобразование также применимо во время использования функции GetDate ()
Попробуйте использовать «#» до и после даты и не забудьте указать формат вашей системы. возможно, «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#
Формат даты – yyyy-mm-dd. Таким образом, вышеуказанный запрос ищет записи старше 12Apr2013
Предложите вам выполнить быструю проверку, установив строку даты на «2013-04-30», если нет ошибки sql, формат даты подтвержден до yyyy-mm-dd.