所以我在SQL Server上有一个datetime
列的表。我想从这个表中选择所有:
select * from dbo.tblMessages
,但我想传入一个datetime
参数。然后,我想从表中选择与tblMessages
中的datetime
列具有相同day
的所有消息,而不仅仅是过去24小时内发布的消息,等等。
我该怎么做呢?
谢谢。
这应该在tblMessages中使用MyDateTimeCol的索引
select * from dbo.tblMessages
WHERE
MyDateTimeCol >= DATEADD(day, DATEDIFF(day, 0, @Mydatetimeparameter), 0)
AND
MyDateTimeCol < DATEADD(day, DATEDIFF(day, 0, @Mydatetimeparameter), 1)
应用于MyDateTimeCol的任何函数都将阻止索引的正确使用,包括this和@Mydatetime之间的DATEDIFF
如果你是在SQL Server 2008上,你可以这样做
SELECT *
FROM tblMessages
WHERE CAST(message_date AS DATE) = CAST(@YourDateParameter AS DATE)
这是可行的。SQL Server将添加ComputeScalar
到计划中,该计划调用内部GetRangeThroughConvert
函数并获取要查找的范围的开始和结束。
如果你需要这样做很多,如果你的SQL Server 2005或更新,你也可以这样做:
-
为日期的日、月、年添加三个计算列,并保留这些
ALTER TABLE dbo.YourTable ADD DayPortion AS DAY(YourDateTimeColumn) PERSISTED -- do the same for MONTH(YourDateTimeColumn) and YEAR(YourDateTimeColumn)
-
为三列添加索引:
CREATE NONCLUSTERED INDEX IX_DatePortions ON dbo.tblMessages(YearPortion, MonthPortion, DayPortion)
-
现在,你可以很容易和快速地搜索那些日子,月份,年份,并与索引,你的搜索将是非常高效和快速的
SELECT (list of columns) FROM dbo.tblMessages WHERE YearPortion = 2011 AND MonthPortion = 4 AND DayPortion = 17
有了这样的设置—三个计算的、持久化的列—您现在可以简单地将新行插入到表中—这三个列将自动计算。
由于它们是持久化和索引的,因此您也可以轻松且非常有效地搜索这些列。
有了这种灵活性,你也可以很容易地找到例如给定月份或年份的所有行。