我有一个表格,其中包含dateTime类型的列。我想做一个查询,选择在该日期发生的所有行。基本上,
SELECT * FROM Table
WHERE [timeStamp] = '02-15-2003'
但是只返回[timeStamp]为'02 -15-2003 00:00:00.000'的行,但实际上我想要那天任何时候的行。
答案 0 :(得分:17)
如果您有索引,那么您将需要一些不会阻止索引使用的内容:
SELECT *
FROM Table
WHERE [timeStamp] >= '20030215'
AND [timeStamp] < '20030216'
您可以在[timeStamp]
列上执行截断操作以删除任何时间部分(取决于实现),但这可能会损害执行计划。不幸的是,你真的必须看看执行计划才能看到这一点,因为有时优化器对某些功能很聪明,有时却不是。
答案 1 :(得分:6)
如果您使用的是SQL 2008,则应该过去CAST。
select * from [Table]
where cast([timeStamp] as date) = '02-15-2003'
Best approach to remove time part of datetime in SQL Server
---更新---
评论者应该在2012年使用这个词来描述为什么这不是最佳解决方案sargability。在最简单的解决方案中,更改WHERE子句中的数据类型会对有界搜索不会对索引使用产生影响。
答案 2 :(得分:1)
在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'
答案 3 :(得分:1)
MS SQL 2014,这非常有效:
SELECT [YourDateColumn] FROM [YourTable] WHERE(DATEPART(dd,[YourDateColumn]) = '29')
可能会在非常大的数据库上出现性能问题。
答案 4 :(得分:0)
试试这个.. SQL SERVER
SELECT * FROM Table WHERE convert(date,[timestamp]) = '2003-02-15'
应返回指定日期的所有行。
答案 5 :(得分:0)
我会创建一个接受“开始日期”和“结束日期”的存储过程
在这种情况下,开始日期和结束日期可以相同
这可确保返回从上午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
答案 6 :(得分:-6)
日期比较可能是一件棘手的事情。
请记住,它是一个日期时间而不是字符串。这就是你得到意想不到的结果的原因。
对于您考虑的特定查询,相应的查询是
SELECT * FROM Table
WHERE 0 = datediff(day,[timestamp],'02-15-2003')
您也可以通过month()和year()进行比较,返回整数值。
您通常必须编写自定义函数来进行非平凡的比较。
另请注意
WHERE 0 = datediff(day,[timestamp],'02-15-2003')
比
好多了WHERE datediff(day,[timestamp],'02-15-2003') = 0
前者不会影响内部效率,而后者则会影响内部效率。