2013-12-11 14 views
0

У меня есть строка с датой колонке в моей таблице:Как сравнить даты в SQL Server?

date1 = 2013-12-11 00:00:00.000 

И я хочу, чтобы сравнить его с датой:

date2 = 11.12.2013 0:00:00 

я:

SELECT * 
FROM ServiceOrder 
WHERE CreateDateTime <= '11.12.2013 0:00:00' 

И я ожидал что в результате я получаю строку с date1, но я не понимаю.

Как правильно установить дату для точного поиска?

UPDATE

Я пробовал:

SELECT * 
FROM ServiceOrder 
WHERE CreateDateTime<= CONVERT(VARCHAR(23),'11.12.2013 0:00:00', 121) 

Но тот же результат.

UPDATE2

SELECT * 
FROM ServiceOrder 
WHERE CreateDateTime <= REPLACE(CONVERT(VARCHAR(19),'11.12.2013', 111),'/','-') 

не работает, либо.

Update3

SELECT * 
FROM ServiceOrder 
WHERE CreateDateTime <= CONVERT(datetime,'11.12.2013 0:00:00', 104) 

не работает, либо.

+0

Как вы видите, ваши даты имеют разный характер. Используйте тот же шаблон, и у вас не будет проблем – bksi

+1

Вам придется конвертировать дату. Вот ссылка, которую вы можете использовать, чтобы найти правильный метод преобразования: http://www.sql-server-helper.com/tips/date-formats.aspx –

+0

@jorgeCampos: я пробовал дату cnvert, но не помогал. Я задаю вопрос/ –

ответ

0

Так что это немного сложно преобразовать формат, потому что он слишком специфичен, и у ms sql нет простых функций формата даты, чтобы сделать это. так что здесь есть способ, чтобы преобразовать всю свою дату:

SELECT * 
    FROM ServiceOrder 
WHERE CreateDateTime <= (
         select convert(datetime, 
          concat(y,'-',m,'-',d,' ',h), 20) as dtConverted 
         from (select substring(dt,1,2) d, 
             substring(dt,4,2) m, 
             substring(dt,7,4) y, 
             substring(dt,12,10) h 
            from (select 
             '11.12.2013 13:00:00' dt) as value 
           ) as convDate 
         ) 

Чтобы преобразовать только дату без времени было бы:

SELECT * 
    FROM ServiceOrder 
WHERE convert(date, CreateDateTime , 104) <= convert(date, 
           substring('11.12.2013 0:00:00',1,10), 104) 

Посмотри здесь на скрипке: http://sqlfiddle.com/#!6/3787b/1

+0

Я буду использовать второе выражение тура. Подумайте, что только даты будут гореть. Спасибо за помощь) –

+0

Рад помочь :) –

+0

Downvoter, пожалуйста, оставьте комментарий! –

1

Используйте это. Вам нужно преобразовать строку в datetime для правильного сравнения. А также использовать правильный номер формата здесь 104

SELECT * 
FROM ServiceOrder 
WHERE CreateDateTime<=CONVERT(datetime,'11.12.2013 0:00:00', 104) 

И лучше практика такова, что взять переменную и использовать его в запросе вместо преобразования их в запросе. Нравится

Declare @CompareDate as DateTime 
SET @CompareDate=CONVERT(datetime,'11.12.2013 0:00:00', 104) 

    SELECT * 
    FROM ServiceOrder 
    WHERE CreateDateTime<[email protected] 
+0

Я опробовал пример, но получил тот же результат. Еще 'date1> date2'. –

+0

Каков тип данных поля CreateDateTime в таблице ServiceOrder? – Priyank

1

Вы должны придерживаться того же формата постоянной даты даты.

Отъезд SET DATEFORMAT.

Устанавливает порядок деталей месяца, дня и даты для интерпретации строк даты, smalldatetime, datetime, datetime2 и datetimeoffset.

http://technet.microsoft.com/en-us/library/ms189491.aspx.

Формат по умолчанию - месяц, день, год.

TSQL достаточно умен, чтобы знать, что date1 не находится в формате по умолчанию, так как 2013 не может быть месяца. Поэтому он интерпретирует его как 11 DEC 2013.

Дата 2 имеет месяц и день в допустимых пределах. Таким образом, вы получаете 12 NOV 2013. Поэтому ничего не возвращается из предложения where в вашем заявлении TSQL.

Проверьте половину пути на этой странице, он показывает допустимые строки литералов для даты времени как в цифровом, так и в буквенно-цифровом формате.

http://technet.microsoft.com/en-us/library/ms187819.aspx

Позволяет шапочку это прочь с небольшим количеством тестовой программы. Простая таблица, три месяца (OCT, NOV, DEC) 11-го дня. Он возвращает только одну дату, которая меньше 10 NOV 2013. Правильный ответ.

-- use temp db 
use tempdb; 
go 

-- simple test table 
create table my_test 
(my_date datetime); 

-- add 3 rows 
insert into my_test values ('2013-12-11 00:00:00.000'); 
insert into my_test values ('2013-11-11 00:00:00.000'); 
insert into my_test values ('2013-10-11 00:00:00.000'); 

-- show the data 
select * from my_test; 

-- just show october 
select * from my_test where my_date < '2013-11-10'; 

enter image description here

Я надеюсь, что это помогает вам.

Смежные вопросы