所以我在SQL Server中有一个表,其上有一个datetime
列。我想从这张表中选择所有内容:
select * from dbo.tblMessages
但我希望传递一个datetime
参数。然后,我想从表中选择与day
中的datetime
列具有相同tblMessages
的所有邮件,而不仅仅是过去24小时内发布的邮件等等。
我该怎么做?
感谢。
答案 0 :(得分:4)
这应该在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的任何函数都将阻止正确使用索引,包括此与@Mydatetime之间的DATEDIFF
答案 1 :(得分:1)
正如您在SQL Server 2008上一样,您可以
SELECT *
FROM tblMessages
WHERE CAST(message_date AS DATE) = CAST(@YourDateParameter AS DATE)
这是可以接受的。 SQL Server将向调用内部ComputeScalar
函数的计划添加GetRangeThroughConvert
,并获取要搜索的范围的开始和结束。
答案 2 :(得分:0)
如果您需要执行此操作,并且如果您使用的是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
使用此设置 - 三个计算的持久列 - 您现在可以简单地在表中插入新行 - 这三列将自动计算。
由于它们已被持久化并编入索引,因此您也可以轻松高效地搜索这些列。
凭借这种灵活性,您还可以轻松找到,例如给定月份或年份的所有行非常好。