我有一个查询,我正在运行,我只想考虑日期,而不是时间,比较两列。我目前有:如何从日期时间列剥离时间列
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