-3

我有一个正在运行的查询,我只想在比较两列时考虑日期,而不是时间。我目前有:

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

显然,这只会显示每次访问在同一天同一时间的行。我只想知道两列是否在同一日期有条目。

4

3 回答 3

8

如果有索引,最有效的方法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。

于 2013-03-22T16:33:41.747 回答
-2

在 where 子句中使用 convert() 函数。确保两次都使用相同的格式。

于 2013-03-22T16:19:31.020 回答
-3

您可以使用 Convert 将日期设为 nvarchar,然后进行如下比较:

SELECT dtvisit1, dtvisit2
FROM Visit
WHERE CONVERT(nvarchar(20), [dtvisit1], 101)  = CONVERT(nvarchar(20), [dtvisit2], 101)
于 2013-03-22T16:19:30.317 回答