2013-12-11 156 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

我會用tour第二個表達式。認爲只有日期會發生。感謝您的幫助) –

+0

很高興幫助:) –

+0

Downvoter,請發表評論! –

1

使用此。您需要將字符串轉換爲日期時間以進行正確比較。並使用正確的格式編號這裏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

表ServiceOrder表中字段CreateDateTime的數據類型是什麼? – Priyank

1

你應該堅持使用相同的日期時間常數格式。

結帳SET DATEFORMAT

設置解釋日期,smalldatetime,datetime,datetime2和datetimeoffset字符串的月份,日期和年份日期部分的順序。

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

默認格式是月,日,年。

TSQL很聰明,知道date1不是默認格式,因爲2013不能是一個月。因此它將其解釋爲2013年12月11日。

日期2的月份和日期都在可接受的範圍內。所以你得到2013年11月12日。因此,你的TSQL語句中的where子句沒有返回。

查看此頁面的一半向下,它顯示數字和字母數字格式的日期時間可接受的文字字符串。

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

允許帽這一關用少量測試程序。簡單的表格,第11天的三個月(OCT,NOV,DEC)。它只返回一個不到2013年11月10日的日期。正確的答案。

-- 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

我希望這可以幫助你。