我有一个我正在运行的查询,我只想在比较两列时考虑日期,而不是时间。我目前有:
SELECT dtvisit1, dtvisit2
FROM dbo.Visit
WHERE dtvisit1 = dtvisit2;
显然,这只会显示每次访问在同一天的相同时间的行。我只是想知道两列是否在同一天都有条目。
答案 0 :(得分: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
,而不会失去sargability。
答案 1 :(得分:-2)
在where子句中使用convert()函数。确保两次都使用相同的格式。
答案 2 :(得分:-3)
您可以使用Convert将日期设为nvarchar,然后像这样进行比较:
SELECT dtvisit1, dtvisit2
FROM Visit
WHERE CONVERT(nvarchar(20), [dtvisit1], 101) = CONVERT(nvarchar(20), [dtvisit2], 101)