从给定日期的表中选择



所以我在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
    

有了这样的设置—三个计算的、持久化的列—您现在可以简单地将新行插入到表中—这三个列将自动计算。

由于它们是持久化和索引的,因此您也可以轻松且非常有效地搜索这些列。

有了这种灵活性,你也可以很容易地找到例如给定月份或年份的所有行。

相关内容

  • 没有找到相关文章

最新更新