2013-11-12 2 views
42

У меня есть таблица с датами, которые все произошло в ноябре месяце. Я написал этот запросЗапрос даты сравнения в 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- -12)

Может быть, это только сравнение дневной части? а не целую дату?

Как это исправить?

CREATED_DATE имеет тип даты

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

+1

Вы сравниваете даты в строки, а не даты к датам –

+4

Может быть, думает '2013-04-12'? 12 апреля? Или, может быть, 'created_date' - строка, а не дата? – jpw

+0

Посмотрите на [Cast & Convert] (http://msdn.microsoft.com/en-us/library/ms187928.aspx) в руководстве по T-SQL и используйте соответствующее преобразование для своей локали – Steve

ответ

46

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

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

В статье Write International Transact-SQL Statements из документации SQL Server объясняет, как писать заявления, которые являются культура инвариантом:

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

EDIT

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

ОБНОВЛЕНИЕ

Чтобы использовать формат ИСО 8601 в буквальном, все элементы должны быть определены. Цитирование from the ISO 8601 section of datetime's documentation

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

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

+1

2013-12-04 - это формат, указанный в ISO8601. – andy

+0

@andy не совсем, формат ISO8601 * включает в себя * элемент времени. Или [как говорят документы] (https://msdn.microsoft.com/en-us/library/ms187819.aspx), 'Чтобы использовать формат ISO 8601, вы должны указать каждый элемент в формате. Это также включает T'. –

+0

Извините за то, что я не понял, мой вопрос в том, что ISO8601 определяет порядок так, как вы описали: ГГГГ-ММ-ДД или короткий YYYYMMDD. Однако, поскольку в документах также указано: «datetime не соответствует требованиям ANSI или ISO 8601». Сам ISO не требует временной части. – andy

0

Формат даты - yyyy-mm-dd. Таким образом, вышеуказанный запрос ищет записи старше 12Apr2013

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

+0

Формат, разделенный тире, является специфичным для культуры –

+0

Формат даты - yyyy-dd-MM – HelpASisterOut

15

Попробуйте как этот

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

-1? пожалуйста, объясните – Nithesh

+5

Формат для конкретной культуры. Это 12 апреля или 4 декабря? Формат, разделенный тире, НЕ является международным форматом –

+0

Это 4 декабря, так как сервер находится в этой культуре, я думаю, мы не хотим больше волноваться о культуре. Во всяком случае, мы не собираемся менять культуру сервера db в последнее время. Ваша точка верна, но я не думаю, что мой ответ неправильный. – Nithesh

2

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

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

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

2

Если Вы сравниваете только с датой юдоли, а затем преобразовать его в актуальном состоянии (не DateTime) будет работать

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

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

1

Попробуйте использовать «#» до и после даты и не забудьте указать формат вашей системы. может быть "YYYYMMDD O YYYY-MM-DD O MM-DD-YYYY O ИСПОЛЬЗОВАНИЕ '/ O \'"

Ex:

select id,numbers_from,created_date,amount_numbers,SMS_text 
from Test_Table 
where 
created_date <= #2013-04-12# 
Смежные вопросы