Проверка равенства в преобразованиях даты и времени в SQL - PullRequest
1 голос
/ 14 апреля 2011

Привет У меня странная проблема при преобразовании даты и времени в SQL-запрос

select * from employee where (CONVERT(VARCHAR(10), doj , 110) 
>= '01/01/2008') 

Я получаю результаты, но для аналогичного запроса:

select * from employee where (CONVERT(VARCHAR(10), doj , 110) 
<= '01/01/2010') 

Янет результатов

По какой-то конкретной причине?

Ответы [ 4 ]

3 голосов
/ 14 апреля 2011

Сравнение значений столбца datetime в операторе select будет немного сложнее.Проверьте результат, и вы заметите, что значение datetime включает время «мм / дд / гггг чч: мм: сс», и вы сравниваете свой запрос с этим «мм / дд / гггг», что в большинстве случаев является причиной того, что когда большинствозапросов с одинаковой датой не возвращается так, как вы ожидали.

Так что если у вас есть это

column1  |  dateTimeColumn2
abc      |  01/24/2011 04:05:00

и ваш запрос будет таким:

declare @param as datetime
set @param = '01/24/2011'

select * from table where dateTimeColumn = '01/24/2011'  
-- This would not return any because '01/24/2011' is written as '01/24/2011 00:00:00'

В вашем коде лучше всего сделать

Select * 
from employee 
where Cast(Convert(varchar(25),doj,101) as Datetime) = Cast(Covert(varchar(25),parameter1,101) as datetime) 
--this will return a result
3 голосов
/ 14 апреля 2011

Преобразование вашей строки в дату и время вместо преобразования даты и времени в строку решит вашу проблему

select * from employee where  doj  
<=  convert(dateteime,'01/01/2010',110)
2 голосов
/ 14 апреля 2011

Если вам нужно иметь даты в строковом представлении, я бы рекомендовал всегда использовать формат ISO-8601 (YYYYMMDD), поскольку это работает во всех системах, независимо Настройки локали / языка / региона / даты.

Кроме того, если ваш столбец doj является DATETIME - зачем даже конвертировать его для сравнения ??

Почему бы не использовать

WHERE doj >= '20080101' 
WHERE doj <= '20100101' 

без преобразования, без беспорядка .....

2 голосов
/ 14 апреля 2011

Я думаю, что вы делаете в запросе сравнение строк, а не сравнение дат.

Предположим, doj - это дата и время, значение которого 01.02.2008.

В вашем запросе проверка состояния будет where ('01/02/2008' <= '01/01/2010')

Поскольку это сравнение строк, оно выдаст false. И запись не будет в результате.

На самом деле вы можете сделать это в mssql:
select * from employee where doj>='01/01/2008' <br> select * from employee where doj<='01/01/2010'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...