如何从datetime列中删除时间

时间:2013-03-22 16:16:28

标签: sql sql-server sql-server-2005

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

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

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

3 个答案:

答案 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)