首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >得到一,二,n.几年前

得到一,二,n.几年前
EN

Stack Overflow用户
提问于 2014-10-10 13:09:50
回答 1查看 87关注 0票数 0

在某些表格中,我应该选择至少一年前创建的项目--就在今天的同一个月和一天。因此,在2011-10-10年、2013年-10-10年创建的项目将适用,但在2014-10-10年将不适用。

下面的查询工作得很好,但也许有一种更优雅的方法?提前谢谢。

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-10 13:46:42

我会(如果可能的话)将表更改为有一个额外的,计算柱,定义为:

代码语言:javascript
复制
DATEADD(year,DATEDIFF(year,CreatedOn,0),CONVERT(date,CreatedOn))

比如说,叫AnniversaryDate。这产生了将日期“正常化”到1900年的效果。这也同样对待2月29日和2月28日(两者都归一化为第28次)。

现在,您可以创建一个此计算列的索引,在其中快速方便地进行搜索。您可以使用相同的公式将GETDATE()转换为搜索此数据的“规范化”日期。你现在要做的就是排除今年发生的结果,这应该像一个额外的过滤器一样简单。因此,您的最后一个查询是:

代码语言:javascript
复制
AnniversaryDate = DATEADD(year,DATEDIFF(year,GETDATE(),0),
                  CONVERT(date,GETDATE())) and
CreatedOn < CONVERT(date,GETDATE())

(我可能会在AnniversaryDate和CreatedOn上创建一个索引,以最大限度地从这个查询中获益)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26300256

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档