从某些表中我应该选择至少在一年前创建的项目 - 与今天相同的月份和日期。因此,在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
答案 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上创建一个索引,以便从此查询中获得最大收益)。