sql - 在 2 个日期之间每月获取准确的日期值
问题描述
我正在尝试获取两个日期之间一个月的天数。所以理想情况下,这看起来像
Month | Days
Jan | 5
Feb | 28
March | 5
日期需要来自一个看起来像这样的表 -
Name | Age | Address | AddressStartDate| AddressEndDate
Steve| 19 | randomAdd | 2018-01-26 | 2018-03-05
Steve| 21 | randomAdd | 2018-01-26 | 2018-03-05
我遇到的问题是我可以在此表中有多个具有完全相同的开始和结束日期的史蒂夫。
理想情况下,我不想制作日历表,我找到了解决这个问题的方法,使用 -
Declare @dtFrom date
Declare @dtTo date
select @dtFrom = 2018-01-26
,@dtTo = 2018-03-05
select
year(dt) [Year], month(dt) [Month],
count(*)
from
(
select top(datediff(d, @dtFrom, @dtTo)) dateadd(d, row_number() over
(order by (select null)), @dtFrom) dt
from sys.columns) q
group by year(dt), month(dt
)
order by [Year], [Month]
但我无法弄清楚如何将这些分开。无论如何我可以在一张桌子上得到这些吗?
我目前有大约 1500 行,我需要复制这些数据!
解决方案
您走在正确的道路上,您只需要使用 CROSS APPLY
例子
Declare @YourTable Table ([Name] varchar(50),[Age] int,[Address] varchar(50),[AddressStartDate] date,[AddressEndDate] date)
Insert Into @YourTable Values
('Steve',19,'randomAdd','2018-01-26','2018-03-05')
,('Steve',21,'randomAdd','2018-01-26','2018-03-05')
Select A.*
,B.*
From @YourTable A
Cross Apply (
Select Month=DateName(MONTH,D)
,Days = count(*)
From (
Select Top (DateDiff(DAY,[AddressStartDate],[AddressEndDate])+1) D=DateAdd(DAY,-1+Row_Number() Over (Order By (Select Null)),[AddressStartDate])
From master..spt_values n1,master..spt_values n2
) B1
Group By Year(D),DateName(MONTH,D)
) B
退货
编辑 - 更新为 NULL EndDate
Select A.*
,B.*
From @YourTable A
Cross Apply (
Select Month=DateName(MONTH,D)
,Days = count(*)
From (
Select Top (DateDiff(DAY,[AddressStartDate],IsNull([AddressEndDate],GetDate()))+1) D=DateAdd(DAY,-1+Row_Number() Over (Order By (Select Null)),[AddressStartDate])
From master..spt_values n1,master..spt_values n2
) B1
Group By Year(D),DateName(MONTH,D)
) B
最终编辑 - 逐年合并
Select A.*
,B.*
From @YourTable A
Cross Apply (
Select Month=concat(DateName(MONTH,D),'-',year(D))
,Days = count(*)
From (
Select Top (DateDiff(DAY,[AddressStartDate],IsNull([AddressEndDate],GetDate()))+1) D=DateAdd(DAY,-1+Row_Number() Over (Order By (Select Null)),[AddressStartDate])
From master..spt_values n1,master..spt_values n2
) B1
Group By Year(D),DateName(MONTH,D)
) B
推荐阅读
- node.js - 尝试打开应用程序时 Heroku 错误代码 H13
- flutter - authStateChanges 仅在调试模式下有效
- python - 使用 libimobiledevice python 绑定的正确方法是什么?
- python - 具有固定主机名的 Kubernetes
- asp.net-core - 使用 UseSerilogRequestLogging 时,Serilog 时间戳在请求结束时,我可以覆盖它吗?
- c# - 错误 CS0411 ASP.NET Core Web 应用程序
- apache - 基于规则和错误类型 htaccess 的重定向
- sql - SQL Server Management Studio 会同步运行多个语句吗?
- asp.net-core - $.getJSON 给出未定义的结果(Razor 网页和 JSONresult)
- git - git config --global credential.helper 'cache' 的 git 凭证缓存有多安全?