SQL 正好减去一年

问题描述 投票:0回答:7

首先我要感谢大家帮助我,它给了我很多关于如何做到这一点的想法,我想出了自己的方法,我只需要帮助将其放入查询中

我希望用户输入一个日期,然后获取当前年份。将两者相减,然后执行每个人都发布的

dateadd
。这可能吗?最好的方法是什么?

year(getdate())-@DYYYY=Y 
dateadd(year,-Y,getdate())
sql sql-server sql-server-2005
7个回答
86
投票

使用这个:

dateadd(year, -1, getdate())

13
投票

根据您对硬编码年份值的评论,使用

 DATEDIFF(year,BOOKED,GETDATE())

获取自您所追求的日期以来的年数应该有望引导您走向您所追求的方向。

你可能最终会得到类似的结果:

SELECT DATEADD(year, -DATEDIFF(year,BOOKED,GETDATE()), GETDATE())

好吧,看起来您真正想做的就是按年份对预订进行分组(我可能是错的,抱歉)。

以下结果有助于实现这一目标吗?

SELECT SDESCR,DATEADD(YEAR, DATEDIFF(YEAR, 0, BOOKED),0), Sum(APRICE) as Total, Sum(PARTY) as PAX
FROM  DataWarehouse.dbo.B01Bookings AS B101Bookings
GROUP BY SDESCR,DATEADD(YEAR, DATEDIFF(YEAR, 0, BOOKED),0)

正如我所说,这是对您目标的猜测,不一定是对您问题的答案。


8
投票

要从日期中减去年份,只需使用 DATEADD() 函数

SELECT DATEADD(year, -1, GETDATE())

编辑:

SELECT SDESCR,DYYYY, Sum(APRICE) as Total, Sum(PARTY) as PAX
FROM  DataWarehouse.dbo.B01Bookings AS B101Bookings
WHERE 
(BOOKED <= Convert(int, Convert(datetime, Convert(varchar, DatePart(month, GETDATE())) + '/' + Convert(varchar, DatePart(day, GetDate())) + '/' + DYYYY))
Group By SDESCR,DYYYY
Order by DYYYY

编辑2:

我刚刚发表了此声明

select  Convert(datetime, Convert(varchar, DatePart(month, GETDATE())) + '/' + Convert(varchar, DatePart(day, GetDate())) + '/' + '2007')

运行良好。所以我的问题是 DYYYY 列中存储了什么?它是否始终包含有效年份,是否可以包含空值?


3
投票

好的...从您对 Joe Stefanelli 的回复来看,我认为您真正想做的部分是避免每年都重写查询。如果是这种情况,那么您可以创建一个数字表。一个简单快速的例子就像这样......

 SELECT TOP 3000
        IDENTITY(INT,1,1) as N
   INTO #Numbers
   FROM Master.dbo.SysColumns sc1,
        Master.dbo.SysColumns sc2

包含从 1 到 3000 的整数的即时表。

这允许您针对查询加入或子选择 #Numbers 表。如果您想制作一个更有限的范围,那么您可以制作一个仅包含您喜欢的年份的表格(或一个将动态制作相同表格的表值函数)。

您还可以更进一步,实现一个表值函数,该函数将返回两列结果

year offset
2010 0    --Produced from DATEPART(y,GETDATE())
2009 -1    --loop/set subtract 1
2008 -2    --repeat until you have enough...

这样,你的 where 子句就可以读成类似

SELECT *
FROM yourTable, yourFunction
WHERE ((DYYYY = CAST(yourFunction.year as VARCHAR) AND (BOOKED <= DATEADD(yy, yourFunction.offset, GETDATE()))

请注意,虽然电视功能每年可以为您节省一些维护编程的时间,但您可能会遭受一些轻微的性能影响。


2
投票

获取 1 年前日期的最简单方法是:

SELECT GETDATE() - 365

1
投票
select DATEADD(yy, -1, getdate())

0
投票

让员工在组织工作一年之前的最简单方法是,我们可以假设只对他们进行评估并选择那些在组织中完成一年的员工。

基本上从今天开始我要减去 1 年。

SELECT * FROM employees
      WHERE date_of_joining < (SELECT DATE_SUB(CURDATE(),INTERVAL 1 YEAR))
;

© www.soinside.com 2019 - 2024. All rights reserved.