我有一个正在运行的查询,我只想在比较两列时考虑日期,而不是时间。我目前有:
SELECT dtvisit1, dtvisit2
FROM dbo.Visit
WHERE dtvisit1 = dtvisit2;
显然,这只会显示每次访问在同一天同一时间的行。我只想知道两列是否在同一日期有条目。
我有一个正在运行的查询,我只想在比较两列时考虑日期,而不是时间。我目前有:
SELECT dtvisit1, dtvisit2
FROM dbo.Visit
WHERE dtvisit1 = dtvisit2;
显然,这只会显示每次访问在同一天同一时间的行。我只想知道两列是否在同一日期有条目。
如果有索引,最有效的方法dtvisit1
可能是:
WHERE dtvisit1 >= DATEDIFF(DAY, 0, dtvisit2)
AND dtvisit1 < DATEDIFF(DAY, -1, dtvisit2)
如果有索引,dtvisit2
则交换它。这仍然允许您至少在一侧使用索引。如果没有索引,您可以使用其他方法,例如转换为字符串,但即使在为一列或两列添加索引后,您仍然需要在以后进行全面扫描。对于大多数人来说,转换为字符串方法似乎是下意识的反应,但是我在这篇博文中演示了为什么这是你最不想做的事情。
您还可以考虑添加计算列,例如:
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。
在 where 子句中使用 convert() 函数。确保两次都使用相同的格式。
您可以使用 Convert 将日期设为 nvarchar,然后进行如下比较:
SELECT dtvisit1, dtvisit2
FROM Visit
WHERE CONVERT(nvarchar(20), [dtvisit1], 101) = CONVERT(nvarchar(20), [dtvisit2], 101)