我有一个包含日期时间类型列的表。我想做一个查询,选择该日期发生的所有行。基本上,
SELECT * FROM Table
WHERE [timeStamp] = '02-15-2003'
但这只会返回 [timeStamp] 为 '02-15-2003 00:00:00.000' 的行,但实际上我想要那天任何时候的行。
我有一个包含日期时间类型列的表。我想做一个查询,选择该日期发生的所有行。基本上,
SELECT * FROM Table
WHERE [timeStamp] = '02-15-2003'
但这只会返回 [timeStamp] 为 '02-15-2003 00:00:00.000' 的行,但实际上我想要那天任何时候的行。
如果你有索引,你会想要一些不会阻止索引被使用的东西:
SELECT *
FROM Table
WHERE [timeStamp] >= '20030215'
AND [timeStamp] < '20030216'
您可以对[timeStamp]
列执行截断操作以消除任何时间部分(依赖于实现),但这可能会损害执行计划。不幸的是,您确实必须查看执行计划才能看到这一点,因为有时优化器对某些功能很聪明,有时则不然。
如果您使用的是 SQL 2008,则应该 CAST to DATE。
select * from [Table]
where cast([timeStamp] as date) = '02-15-2003'
在 SQL Server 中删除日期时间的时间部分的最佳方法
- - 更新 - -
评论者应该在 2012 年用来描述为什么这不是最佳解决方案的词是sargability。更改 WHERE 子句中的数据类型虽然是最简单的解决方案,但对索引使用有影响,而有界搜索则不会。
在 sql server 2008 + 中:
SELECT * FROM Table
WHERE cast( [timeStamp] as date) = '02-15-2003'
或者
只是零时间部分:(2005+)
SELECT * FROM Table
WHERE DateAdd(day, DateDiff(day, 0, [timeStamp]), 0) = '02-15-2003'
MS SQL 2014,这很完美:
SELECT [YourDateColumn] FROM [YourTable] WHERE(DATEPART(dd,[YourDateColumn]) = '29')
在非常大的数据库上可能会有一些性能问题。
试试这个.. SQL SERVER
SELECT * FROM Table WHERE convert(date,[timestamp]) = '2003-02-15'
应该返回指定日期的所有行。
我将创建一个接受“开始日期”和“结束日期”的存储过程
在这种情况下,开始日期和结束日期可以相同
这可确保返回从上午 12:01 到晚上 11:59 的所有行
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
Create PROCEDURE TestBetweenDates
-- Add the parameters for the stored procedure here
@StartDate DateTime = 0,
@EndDate DateTime = 0
AS
BEGIN
SET NOCOUNT ON;
SET @StartDate = cast(Convert(varchar(10), DateAdd(d, -6, @StartDate ), 101) + ' 12:01 AM' as datetime)
SET @EndDate = cast(Convert(varchar(10), DateAdd(d, -0, @EndDate), 101) + ' 11:59 PM' as datetime)
SELECT * FROM Table
WHERE ([timeStamp] BETWEEN @StartDate AND @EndDate)
END
GO
日期比较可能是一件棘手的事情。
请记住,它是日期时间而不是字符串。这就是为什么你会得到意想不到的结果。
对于您想到的特定查询,适当的查询是
SELECT * FROM Table
WHERE 0 = datediff(day,[timestamp],'02-15-2003')
您也可以按返回整数值的月()和年()进行比较。
您通常必须编写自定义函数来获得重要的比较。
另请注意
WHERE 0 = datediff(day,[timestamp],'02-15-2003')
比
WHERE datediff(day,[timestamp],'02-15-2003') = 0
前者不干扰内部效率,而后者则干扰。