sql-server - 如何在日期范围内为每个月创建新行?
问题描述
我需要创建一个视图,为日期范围之间的每个月创建新行。我的预订表的数据示例如下所示。
Booking ID Booking Name Start Date End Date Booked Days
1 HolidayUSA 1/01/2020 15/02/2020 46
2 HolidayEurope 20/01/2020 10/03/2020 50
3 HolidayUK 14/03/2020 19/03/2020 5
我想创建一个视图,该视图将为日期范围之间的每个月添加一条新记录,根据该月的天数计算预订天数,并添加月/年字段。
预期输出:
我正在使用 Microsoft SQL Server。任何帮助将不胜感激。
解决方案
这是我最接近的近似值:
declare @tb table ([Booking Id] int, [Booking Name] varchar(30),
[Start Date] datetime, [End Date] datetime)
-- Sample data
insert @tb values
(1, 'HolidayUSA','20200101','20200215'),
(2, 'HolidayEUROPE','20200120','20200310'),
(3, 'HolidayUK','20200314','20200319')
-- Showing sample data
select *, dateDiff(dd, [Start Date], [End Date]) [Booked Days]
from @tb
declare @dd smallint
select @dd = max(dateDiff(dd, [Start Date], [End Date])) from @tb
with day_cte as (
select 1 as nbd union all
select nbd + 1 from day_cte where nbd <= @dd)
select [Booking Id], [Booking Name], [Start Date], [End Date]
, datePart(yy, dateAdd(dd, nbd, [Start Date])) [Year]
, left(dateName(mm, dateAdd(dd, nbd, [Start Date])), 3) [Month]
, count(*) [Booked Days]
from @tb, day_cte
where nbd <= dateDiff(dd, [Start Date], [End Date])
group by [Booking Id], [Booking Name], [Start Date], [End Date]
, datePart(yy, dateAdd(dd, nbd, [Start Date]))
, dateName(mm, dateAdd(dd, nbd, [Start Date]))
推荐阅读
- assembly - Turbo C / VGA x86 组件:从 ram 复制到 vram
- typescript - 如何在我的 Angular5 应用程序中发送带有附件的电子邮件(gmail)?
- spring-boot-actuator - 如何在 Actuator /health 中启用 JMS 提供者状态
- java - 使用 Paypal REST SDK 最佳实践进行单元/模拟测试
- vba - 查找除数字或“C”以外的任何内容
- python - 尝试在 Google 的文本到语音 API 中合成语音时出错
- php - PHP和Ajax将文件路径上传到Mysql并将重命名的图像保存到文件夹失败
- regex - 使用正则表达式查找特定模式的最佳方法是什么?
- amazon-web-services - 如何在 AWS Lambda 上禁用出站互联网连接?
- javascript - JavaScript 对象和原语