我有兩個表,其中列[date]
是類型DATETIME2(0)
。比較DATETIME和DATE忽略時間部分
我必須比較兩個記錄只有他們的日期部分(日+月+年),丟棄時間部分(小時+分鐘+秒)。
我該怎麼做?
我有兩個表,其中列[date]
是類型DATETIME2(0)
。比較DATETIME和DATE忽略時間部分
我必須比較兩個記錄只有他們的日期部分(日+月+年),丟棄時間部分(小時+分鐘+秒)。
我該怎麼做?
使用CAST
在SQL Server 2008中的新DATE
數據類型比較只是日期部分:
IF CAST(DateField1 AS DATE) = CAST(DateField2 AS DATE)
在馬克的回答一個小缺點是,無論datefields已強制轉換,這意味着你會無法利用任何指標。
因此,如果需要編寫一個可以從日期字段上的索引獲益的查詢,那麼以下(相當複雜)的方法是必需的。
(DF1 >= CAST(DF2 AS DATE)) AND (DF1 < DATEADD(dd, 1, CAST(DF2 AS DATE)))
PS:另一種僅提取日期的方法(在舊版本的SQL Server中)是使用內部表示日期的技巧。
CAST(FLOOR(CAST(DF2 AS FLOAT)) AS DATETIME)
對於比較兩個日期像MM/DD/YYYY到MM/DD/YYYY。 記住第一個字段的欄類型必須是dateTime。 示例:columnName:payment_date dataType:DateTime。
之後,你可以很容易地比較它。 查詢:
select * from demo_date where date >= '3/1/2015' and date <= '3/31/2015'.
它很簡單...... 它測試了.....
這並不完全回答這個問題。它查詢一個月,而不是一天。 – 2016-07-21 21:16:43
對於您的March查詢:如果日期是'3/31/2015'時間13:00,則不會被找到。你應該使用<'4/1/2015'。 – 2016-07-21 21:16:49
也考慮使用國際日期格式'2015-03-01'。在加拿大(和許多其他地方),官方格式是DD/MM/YYYY,這使得兩種格式都不明確並且存在問題。 – 2016-07-21 21:20:20
雖然我upvoted答案標記爲正確的。我想談談一些讓這個問題困擾的人的事情。
一般情況下,如果您僅在日期值過濾。 Microsoft建議使用ymd
或y-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
你可以試試這個
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
我認爲你的意思=而非==。 – GilM 2009-12-03 22:29:28
@GilM:當然! ;-)今天C#太多;-) – 2009-12-03 22:29:59