获取在一年,两年,几年前创建的项目

时间:2014-10-10 13:09:51

标签: sql sql-server-2008 datetime

从某些表中我应该选择至少在一年前创建的项目 - 与今天相同的月份和日期。因此,在2011-10-10,2013-10-10创建的项目将适合,但不适合2014-10-10。

以下查询工作正常,但也许有更优雅的方式?提前谢谢。

select * from myTable 
where 
    DATEPART(MONTH, CreatedOn) = DATEPART(MONTH, GETDATE()) -- item was created at the same month
    and DATEPART(DAY, CreatedOn) = DATEPART(DAY, GETDATE()) -- and at the same day
    and DATEDIFF(YEAR, CreatedOn, GETDATE()) >= 1           -- and at least one year ago

1 个答案:

答案 0 :(得分:1)

我会(如果可能的话)将表格更改为额外的computed column,定义为:

DATEADD(year,DATEDIFF(year,CreatedOn,0),CONVERT(date,CreatedOn))

说,叫AnniversaryDate。这具有"正常化" 1900年的日期。2月29日也与2月28日相同(均标准化为28日)。

您现在可以创建一个index on this computed column,快速轻松地在其中进行搜索。您使用相同的公式将GETDATE()转换为"标准化"搜索此数据的日期。您现在要做的就是排除今年发生的结果,这应该像一个额外的过滤器一样简单。所以你最后的疑问是:

AnniversaryDate = DATEADD(year,DATEDIFF(year,GETDATE(),0),
                  CONVERT(date,GETDATE())) and
CreatedOn < CONVERT(date,GETDATE())

(我可能会在AnniversaryDate和CreatedOn上创建一个索引,以便从此查询中获得最大收益)。