2009-12-03 71 views

回答

200

使用CAST在SQL Server 2008中的新DATE數據類型比較只是日期部分:

IF CAST(DateField1 AS DATE) = CAST(DateField2 AS DATE) 
+3

我認爲你的意思=而非==。 – GilM 2009-12-03 22:29:28

+2

@GilM:當然! ;-)今天C#太多;-) – 2009-12-03 22:29:59

53

在馬克的回答一個小缺點是,無論datefields已強制轉換,這意味着你會無法利用任何指標。

因此,如果需要編寫一個可以從日期字段上的索引獲益的查詢,那麼以下(相當複雜)的方法是必需的。

  • 索引的datefield(稱爲DF1)必須不受任何類型的函數影響。
  • 因此,您必須將DF1與DF2當日的全部日期時間值進行比較。
  • 這是從DF2的日期部分到DF2後一天的日期部分。
  • I.e. (DF1 >= CAST(DF2 AS DATE)) AND (DF1 < DATEADD(dd, 1, CAST(DF2 AS DATE)))
  • 注意:這是非常重要的比較是> =(嚴格)< DF2後的第二天(允許平等)到DF2的日期和。此外,BETWEEN運算符不起作用,因爲它允許兩邊平等。

PS:另一種僅提取日期的方法(在舊版本的SQL Server中)是使用內部表示日期的技巧。

  • 將日期轉換爲浮點型。
  • 截斷小數部分
  • 鑄值返回到一個日期時間
  • CAST(FLOOR(CAST(DF2 AS FLOAT)) AS DATETIME)
-3

對於比較兩個日期像MM/DD/YYYYMM/DD/YYYY。 記住第一個字段的欄類型必須是dateTime。 示例:columnName:payment_date dataType:DateTime

之後,你可以很容易地比較它。 查詢:

select * from demo_date where date >= '3/1/2015' and date <= '3/31/2015'. 

它很簡單...... 它測試了.....

+0

這並不完全回答這個問題。它查詢一個月,而不是一天。 – 2016-07-21 21:16:43

+0

對於您的March查詢:如果日期是'3/31/2015'時間13:00,則不會被找到。你應該使用<'4/1/2015'。 – 2016-07-21 21:16:49

+0

也考慮使用國際日期格式'2015-03-01'。在加拿大(和許多其他地方),官方格式是DD/MM/YYYY,這使得兩種格式都不明確並且存在問題。 – 2016-07-21 21:20:20

3

雖然我upvoted答案標記爲正確的。我想談談一些讓這個問題困擾的人的事情。

一般情況下,如果您僅在日期值過濾。 Microsoft建議使用ymdy-m-d的語言中性格式。

注意形式「2007-02-12」被認爲是中性語言只 爲數據類型DATE,DATETIME2,和DATETIMEOFFSET。

使用上述方法做日期比較很簡單。考慮以下人爲的例子。

--112 is ISO format 'YYYYMMDD' 
declare @filterDate char(8) = CONVERT(char(8), GETDATE(), 112) 

select 
    * 
from 
    Sales.Orders 
where 
    CONVERT(char(8), OrderDate, 112) = @filterDate 

在一個完美的世界,在執行任何操作的過濾柱應該避免,因爲這可以防止SQL Server有效地利用索引。也就是說,如果您存儲的數據只關注日期而不是時間,請考慮以午夜爲DATETIME作爲時間。因爲:

當SQL Server將文字轉換爲過濾列的類型時, 將在未指示時間部分時假定爲午夜。如果您想要這樣的 篩選器從指定日期返回所有行,則需要確保 您將所有值都以午夜時間存儲爲時間。

因此,假設您只關心日期,並存儲您的數據。上面的查詢可以簡化爲:

--112 is ISO format 'YYYYMMDD' 
declare @filterDate char(8) = CONVERT(char(8), GETDATE(), 112) 

select 
    * 
from 
    Sales.Orders 
where 
    OrderDate = @filterDate 
0

你可以試試這個

CONVERT(DATE, GETDATE()) = CONVERT(DATE,'2017-11-16 21:57:20.000') 

我測試的MS SQL 2014下面的代碼

select case when CONVERT(DATE, GETDATE()) = CONVERT(DATE,'2017-11-16 21:57:20.000') then 'ok' 
      else '' end