在某些表格中,我应该选择至少一年前创建的项目--就在今天的同一个月和一天。因此,在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发布于 2014-10-10 13:46:42
我会(如果可能的话)将表更改为有一个额外的,计算柱,定义为:
DATEADD(year,DATEDIFF(year,CreatedOn,0),CONVERT(date,CreatedOn))比如说,叫AnniversaryDate。这产生了将日期“正常化”到1900年的效果。这也同样对待2月29日和2月28日(两者都归一化为第28次)。
现在,您可以创建一个此计算列的索引,在其中快速方便地进行搜索。您可以使用相同的公式将GETDATE()转换为搜索此数据的“规范化”日期。你现在要做的就是排除今年发生的结果,这应该像一个额外的过滤器一样简单。因此,您的最后一个查询是:
AnniversaryDate = DATEADD(year,DATEDIFF(year,GETDATE(),0),
CONVERT(date,GETDATE())) and
CreatedOn < CONVERT(date,GETDATE())(我可能会在AnniversaryDate和CreatedOn上创建一个索引,以最大限度地从这个查询中获益)。
https://stackoverflow.com/questions/26300256
复制相似问题