我有一個查詢,我正在運行,我只想考慮日期,而不是時間,比較兩列。我目前有:如何從日期時間列剝離時間列
SELECT dtvisit1, dtvisit2
FROM dbo.Visit
WHERE dtvisit1 = dtvisit2;
顯然這隻會顯示每個訪問在同一天的同一時間的行。我只想知道兩欄是否在同一天有條目。
我有一個查詢,我正在運行,我只想考慮日期,而不是時間,比較兩列。我目前有:如何從日期時間列剝離時間列
SELECT dtvisit1, dtvisit2
FROM dbo.Visit
WHERE dtvisit1 = dtvisit2;
顯然這隻會顯示每個訪問在同一天的同一時間的行。我只想知道兩欄是否在同一天有條目。
你可以使用轉換,使日期爲nvarchar,然後做這樣的比較:
SELECT dtvisit1, dtvisit2
FROM Visit
WHERE CONVERT(nvarchar(20), [dtvisit1], 101) = CONVERT(nvarchar(20), [dtvisit2], 101)
轉換日期字符串通常是一個非常可怕的想法。 – JNK 2013-03-22 17:09:58
使用CONVERT()函數的where子句。確保兩次使用相同的格式。
最有效的方法,如果有上dtvisit1
的指數可能會是:
WHERE dtvisit1 >= DATEDIFF(DAY, 0, dtvisit2)
AND dtvisit1 < DATEDIFF(DAY, -1, dtvisit2)
如果在dtvisit2
索引然後圍繞它掉。這仍然會允許您至少在一側使用索引。如果沒有索引,則可以使用其他方法(例如轉換爲字符串),但即使在將索引添加到一列或兩列後,仍有可能仍需要完整掃描。轉換爲字符串方式似乎是大多數人的膝蓋反應,但I demonstrate in this blog post why that is the last thing you want to do。
您也可以考慮加入一個計算列,如:
ALTER TABLE dbo.Visit
ADD visit1c AS (DATEDIFF(DAY, 0, dtvisit1));
ALTER TABLE dbo.Visit
ADD visit2c AS (DATEDIFF(DAY, 0, dtvisit2));
然後,你可以只說WHERE visit1c = visit2c
。更簡單的是:
ALTER TABLE dbo.Visit
ADD visitc AS (DATEDIFF(DAY, dtvisit1, dtvisit2));
然後你可以說WHERE visitc = 0
。
您可能想要調查持久性和/或索引它們。
在SQL Server 2008中,您可以簡單地將雙方轉換爲DATE
,而不會丟失可控性。
我一直看到這個邏輯作爲從日期時間字段中剝離時間的方式,但是當我運行select DATEADD(day,0,getdate())時,我得到了時間分量。我錯過了什麼? – 2013-03-22 17:29:29
@你會注意到我使用'DATEDIFF',而不是'DATEADD'。試試'SELECT DATEADD(DAY,DATEDIFF(DAY,0,GETDATE()),0);'。計算列上方只是代表跨越邊界數的整數。而WHERE子句做隱式轉換,例如嘗試'DECLARE @d DATETIME = DATEDIFF(DAY,0,GETDATE()); SELECT @d;'。 – 2013-03-22 17:31:35
我注意到,但是當我運行該查詢時,我看到一個整數並且感到困惑。你必須原諒我,我很容易混淆。 – 2013-03-22 17:51:45
是dvisit時間戳嗎? – 2013-03-22 16:20:10
這個問題已經回答了幾乎完全是在這裏: http://stackoverflow.com/questions/1177449/best-approach-to-remove-time-part-of-datetime-in-sql-server – 2013-03-22 16:24:09