SQL减去一年

时间:2010-11-22 15:33:09

标签: sql sql-server sql-server-2005

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

我希望用户输入日期,然后获取当前年份。减去两个,然后执行每个人都发布的日期添加。这是可能的,最好的方法是什么?

year(getdate())-@DYYYY=Y 

   

 dateadd(year,-Y,getdate())

6 个答案:

答案 0 :(得分:33)

使用此:

dateadd(year, -1, getdate())

答案 1 :(得分:8)

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

 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)

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

答案 2 :(得分: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()))

请注意,虽然tv功能每年都会为您节省一些维护编程,但您可能会遇到一些轻微的性能损失。

答案 3 :(得分:2)

要从日期减去一年,只需使用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列中的是什么?它是否总是包含有效年份,它是否包含Null?

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

SELECT GETDATE() - 365