首先,我要感谢大家帮助我,它给了我很多关于如何做到这一点的想法,我提出了自己的方法,我只需要帮助将它放入查询中
我希望用户输入日期,然后获取当前年份。减去两个,然后执行每个人都发布的日期添加。这是可能的,最好的方法是什么?
year(getdate())-@DYYYY=Y
dateadd(year,-Y,getdate())
答案 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