2016-09-27 3 views
1

Я проверяю условие 12/09/2016 к 13/09/2016 но не показывает мне данные для 13/09/2016 и дает ошибкуПочему дата не принимает 13/09/2016

превращение символьного типа данных для данных даты и времени тип привел к значению даты и времени вне диапазона.

Вот мой запрос

SELECT DISTINCT 
    b.mkey , a.N_UserMkey, cuser_id,isnull(a.N_UserMkey,cuser_id) aa, 
    ISNULL(b.first_name + ' ', '') 
    + ISNULL(b.last_name, '') NAME, convert(varchar,a.U_datetime,103) Action_Date 
    FROM  inward_doc_tracking_trl a 
    INNER JOIN user_mst b ON isnull(a.N_UserMkey,cuser_id) = b.mkey 
    WHERE 
    convert(datetime,a.U_datetime,103) 
    BETWEEN convert(varchar,'12/09/2016',103) 
    AND convert(varchar,'13/09/2016',103) 
    and b.mkey=2357 
+1

Формат 'MM/DD/YYYY'? – jarlh

+2

@jarlh: нет, я хочу в формате 'dd/MM/yyy'. Я использовал 103 для этого – BNN

+0

Я просто догадываюсь, что из-за языка системы он берет данные с форматом: «месяц/день/год». Попробуйте '2016-09-13' – Rumpelstinsk

ответ

2

Я не уверен, но мне кажется, что вы cummulating несколько ошибок здесь:

  • Не проверять диапазоны дат с BETWEEN. Это очень непросто, из-за временной части времени. Часто забывается ... Возможно, вы можете read this great blog by Aaron Betrand
  • Никогда не используйте литеральные даты в определенных для культуры форматах. Вы можете read this (and other answers there)
  • Сравните данные всегда в необходимом типе. Вы конвертируете даты в строку только для сравнения alphanumerically?
  • в convert(varchar,'12/09/2016',103) вы используете varchar без длины ... One more bad habit to kick

Попробуйте изменить положение WHERE для этого (все DateTimes на 12 сентября, но не на 13)

WHERE a.U_datetime >= {d'2016-09-12'} AND a.U_datetime<{d'2016-09-13'} 

или это (все даты 12 и 13 сентября)

WHERE a.U_datetime >= {d'2016-09-12'} AND a.U_datetime<{d'2016-09-14'} 
+0

, которую я должен использовать, сначала один или второй.Я смущен – BNN

+0

@nad Извините, был «конвертировать» в многое ... См. Мое обновление – Shnugo

+0

что это 'd' здесь ?? – BNN

1

Вам нужно преобразовать в DATETIME

... 
BETWEEN convert(datetime,'12/09/2016',103) 
    AND convert(datetime,'13/09/2016',103) 

В настоящее время запрос только оставляет между аргументами, как VARCHAR, а затем сервер должен сравнить их с convert(datetime,a.U_datetime,103). В этот момент они преобразуются в DATETIME без определенного формата.

+0

Нельзя проверять диапазоны дат с помощью 'BETWEEN' ... – Shnugo

+0

@Shnugo Это просто вопрос запоминания МЕЖДУНАРОДНЫЙ ВКЛЮЧЕН (> =, < =) для дат, целых чисел, любого типа. – Serg

+0

Не совсем ... Самые последние мгновения до и после полуночи могут быть проблемой ... взятие 'МЕЖДУ {d'2016-09-17 '} И {d'2016-09-18'}' будет ** inlcude ** запись ровно в полночь + крошечное время ** следующего ** дня, в то время как 'BETWEEN {d'2016-09-17 '} И {ts'2016-09-17 23:59:59'}' может пропустить записи самой последней секунды (даже если указаны миллисекунды ...). Допустимо, очень маленькая проблема, но не обязательно ... – Shnugo