2013-03-22 70 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