sql - 如何在 TSQL 中的两个日期之间获得星期二凌晨 4 点有多少小时
问题描述
我有一个非常具体的统计数据,我需要从中获取信息。
这是这个问题的后续,它只询问凌晨 4 点,我现在还需要补充一点,那是星期二
如何获取 TSQL 中的两个日期之间的凌晨 4 点有多少小时
我需要计算出两个日期之间在一周中的某一天出现了多少次特定时间。
例如,我需要知道两个日期之间有多少个星期二凌晨 4 点。
例如,以下将给出结果 = 1,因为星期二有 1 次出现 4AM
declare @date1 datetime = '2019-10-01 00:00:00.000';
declare @date2 datetime = '2019-10-02 00:00:00.000';
例如,以下将给出结果 = 0,因为周二有 0 次凌晨 4 点
declare @date1 datetime = '2019-10-01 05:00:00.000';
declare @date2 datetime = '2019-10-02 00:00:00.000';
例如,以下将给出结果 = 2,因为已经有 2 个 4AM
declare @date1 datetime = '2019-10-01 03:00:00.000';
declare @date2 datetime = '2019-10-08 05:00:00.000';
例如,以下将给出结果 = 2,因为有 2 个凌晨 4 点,即使它们仅在两个星期二的凌晨 4:00 时间
declare @date1 datetime = '2019-10-01 04:00:00.000';
declare @date2 datetime = '2019-10-08 04:00:00.000';
我有一些代码可以获取两个日期之间一周中有多少天,以及两个日期之间有多少个凌晨 4 点,但没有合并。
这是我尝试过的代码,它适用于我的 4 个测试中的 3 个。
SET DATEFIRST 1
declare @HourOfDay int = 4
declare @tests table (
date1 datetime,
date2 datetime
)
INSERT INTO @tests VALUES
('2019-10-01 00:00:00.000', '2019-10-02 00:00:00.000'), -- returns 1 CORRECT
('2019-10-01 05:00:00.000', '2019-10-02 00:00:00.000'), -- returns 1 INCORRECT
('2019-10-01 03:00:00.000', '2019-10-08 05:00:00.000'), -- returns 2 CORRECT
('2019-10-01 04:00:00.000', '2019-10-08 04:00:00.000'); -- returns 2 CORRECT
select
date1,
date2,
DATEDIFF(DAY,DATEADD(SECOND,-1,DATEADD(HOUR, -1 * @HourOfDay, date1)),DATEADD(HOUR, -1 * @HourOfDay, date2)) / 7 + 1
from @tests
解决方案
我建议使用日历表,但您也可以使用临时计数/数字表
在子查询 B 中,我们正在创建一个从 2015 年 12 月 31 日开始的 10,000 天的动态日历表。 您可以调整或使动态
例子
Declare @YourTable table (Date1 datetime,Date2 datetime)
Insert Into @YourTable values
('2019-10-01 00:00:00.000','2019-10-02 00:00:00.000')
,('2019-10-01 05:00:00.000','2019-10-02 00:00:00.000')
,('2019-10-01 03:00:00.000','2019-10-08 05:00:00.000')
,('2019-10-01 04:00:00.000','2019-10-08 04:00:00.000')
Select A.*
,Cnt=count(D)
From @YourTable A
Left Join (
Select D = DateAdd(DAY,N,'2015-12-31 04:00:00')
From ( Select Top 10000 N=Row_Number() Over (Order By (Select NULL)) From master..spt_values n1, master..spt_values n2 ) A
) B
On DateName(WEEKDAY,D)='Tuesday'
and D >=Date1 and D<=Date2
Group By Date1,Date2
退货
Date1 Date2 Cnt
2019-10-01 00:00:00.000 2019-10-02 00:00:00.000 1
2019-10-01 05:00:00.000 2019-10-02 00:00:00.000 0
2019-10-01 04:00:00.000 2019-10-08 04:00:00.000 2
2019-10-01 03:00:00.000 2019-10-08 05:00:00.000 2
推荐阅读
- kubernetes - 如何使用 Horizontal Pod Autoscaler 根据子部署的资源利用率来扩展自定义资源 (CR)?
- typescript - 如何使用带有 registerComponent 的 React Native Navigation 和 Typescript 键入组件
- elasticsearch - 如何为每个查询设置 Apollo 链接 URI - 初始 uri 保留,我应该使用动态 uri(角度 8)
- bash - Jenkinsfile 中错误地转义了 sed 命令
- python - 为什么 python 的 exec 似乎在函数中不起作用?
- php - 如何将带有文本的字段更新到数据库中的表中?
- python - 如何使用 python-scrape h4 信息从网站上抓取表格
- html - Node.js:如何从 app.js 文件添加到我的应用程序的 index.html 文件
- javascript - 如何 .push 进入数组数组
- javascript - 为什么这段代码不返回数值?