从给定日期的表中选择

时间:2011-04-17 19:49:27

标签: sql sql-server tsql datetime

所以我在SQL Server中有一个表,其上有一个datetime列。我想从这张表中选择所有内容:

select * from dbo.tblMessages

但我希望传递一个datetime参数。然后,我想从表中选择与day中的datetime列具有相同tblMessages的所有邮件,而不仅仅是过去24小时内发布的邮件等等。

我该怎么做?

感谢。

3 个答案:

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

使用此设置 - 三个计算的持久列 - 您现在可以简单地在表中插入新行 - 这三列将自动计算。

由于它们已被持久化并编入索引,因此您也可以轻松高效地搜索这些列。

凭借这种灵活性,您还可以轻松找到,例如给定月份或年份的所有行非常好。