2013-03-22 90 views
-3

我有一個查詢,我正在運行,我只想考慮日期,而不是時間,比較兩列。我目前有:如何從日期時間列剝離時間列

SELECT dtvisit1, dtvisit2 
    FROM dbo.Visit 
    WHERE dtvisit1 = dtvisit2; 

顯然這隻會顯示每個訪問在同一天的同一時間的行。我只想知道兩欄是否在同一天有條目。

+0

是dvisit時間戳嗎? – 2013-03-22 16:20:10

+0

這個問題已經回答了幾乎完全是在這裏: http://stackoverflow.com/questions/1177449/best-approach-to-remove-time-part-of-datetime-in-sql-server – 2013-03-22 16:24:09

回答

-3

你可以使用轉換,使日期爲nvarchar,然後做這樣的比較:

SELECT dtvisit1, dtvisit2 
FROM Visit 
WHERE CONVERT(nvarchar(20), [dtvisit1], 101) = CONVERT(nvarchar(20), [dtvisit2], 101) 
+5

轉換日期字符串通常是一個非常可怕的想法。 – JNK 2013-03-22 17:09:58

-2

使用CONVERT()函數的where子句。確保兩次使用相同的格式。

8

最有效的方法,如果有上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,而不會丟失可控性。

+0

我一直看到這個邏輯作爲從日期時間字段中剝離時間的方式,但是當我運行select DATEADD(day,0,getdate())時,我得到了時間分量。我錯過了什麼? – 2013-03-22 17:29:29

+1

@你會注意到我使用'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

+0

我注意到,但是當我運行該查詢時,我看到一個整數並且感到困惑。你必須原諒我,我很容易混淆。 – 2013-03-22 17:51:45