如何根据上次结果将日期增加一年(DateTime Banding)
Posted
技术标签:
【中文标题】如何根据上次结果将日期增加一年(DateTime Banding)【英文标题】:How To Increment Date By One Year, Based on Last Result (DateTime Banding) 【发布时间】:2019-01-28 11:10:38 【问题描述】:希望我能比标题更好地解释这一点。
我有一个如下所示的活动表:
|身份证| |许可证号| |日期时间| |1 | |123 | |2017-11-17 11:19:04.420| |2 | |123 | |2017-11-26 10:16:52.790| |3 | |123 | |2018-02-06 11:13:21.480| |4 | |123 | |2018-02-19 10:12:32.493| |5 | |123 | |2018-05-16 09:33:05.440| |6 | |123 | |2019-01-02 10:05:25.193|我需要的是每个许可证号的行数,基本上以 12 个月的间隔分组。但是,年份需要从上一个条目结束时开始。
例如,我需要从 2017-11-17 11:19:04.420 开始的 12 个月的所有记录的计数,然后我需要从 (2017-11-17 11:19:04.420 开始的所有记录的计数+ 12 个月)再延长 12 个月,依此类推。
我考虑过使用递归 CTE、LAG 函数等,但无法完全弄清楚。我可能可以使用 CASE 语句和静态值做一些事情,但这需要每年更新报告代码。
任何为我指明正确方向的帮助将不胜感激!
【问题讨论】:
您能否发布您提供的数据的预期输出以及到目前为止的尝试? 【参考方案1】:我认为以下使用 CTE 的代码可以帮助您,但我不完全确定您想要实现什么:
WITH CTE AS
(
SELECT TOP 1 DateTime
FROM YourTable
ORDER BY ID
UNION ALL
SELECT DATEADD(YEAR, 1, DateTime)
FROM CTE
WHERE DateTime<= DATEADD(YEAR, 1, GETDATE())
)
SELECT LicenseNumber, DateTime, Count(*) AS Rows
FROM CTE
INNER JOIN YourTable
ON YourTable.DateTime BETWEEN CTE.DateTime AND DATEADD(YEAR, 1, CTE.DateTime)
GROUP BY LicenseNumber, DateTime;
【讨论】:
【参考方案2】:嗯。您只需要第一次记录后每隔 12 个月的记录数吗?
如果是这样:
select dateadd(year, yr - 1, min_datetime),
dateadd(year, yr, min_datetime),
count(t.id)
from (values (1), (2), (3)) v(yr) left join
(select t.*,
min(datetime) over () as min_datetime
from t
) t
on t.datetime >= dateadd(year, yr - 1, min_datetime) and
t.datetime < dateadd(year, yr, min_datetime)
group by dateadd(year, yr - 1, min_datetime),
dateadd(year, yr, min_datetime)
order by yr;
如果你想要的话,这可以很容易地延长到更多年。
【讨论】:
以上是关于如何根据上次结果将日期增加一年(DateTime Banding)的主要内容,如果未能解决你的问题,请参考以下文章
显示自最近的数据库 DateTime 以来经过的时间,并每隔一秒增加一次
Python 日期时间datetime 加一天,减一天,加减一小时一分钟,加减一年