【发布时间】:2021-01-02 04:27:16
【问题描述】:
我的桌子上有一个日历,我应该取出每个月的设备可用性,直到今天。 表格如下:
create table period
(GCP_START date, GCP_END date,
GCP_MONSTART int, GCP_MONEND int,
GCP_TUESSTART int, GCP_TUESEND int,
GCP_WEDSTART int, GCP_WEDEND int,
GCP_THURSSTART int, GCP_THURSEND int,
GCP_FRISTART int, GCP_FRIEND int,
GCP_SATSTART int, GCP_SATEND int,
GCP_SUNSTART int, GCP_SUNEND int);
insert into period values
('2020-10-25', '2020-10-31', 360, 1320, 360, 1320, 360, 1320, 360, 1320, 360, 1320, NULL, NULL, NULL, NULL),
('2020-11-01', '2020-11-30', 360, 1320, 360, 1320, 360, 1320, 360, 1320, 360, 1320, NULL, NULL, NULL, NULL),
('2020-12-01', '2020-12-23', 360, 1320, 360, 1320, 360, 1320, 360, 1320, 360, 1320, NULL, NULL, NULL, NULL),
('2020-12-24', '2020-12-24', 360, 720, 360, 720, 360, 720, 360, 720, 360, 720, NULL, NULL, NULL, NULL),
('2020-12-27', '2020-12-31', 480, 1020, 480, 1020, 480, 1020, 480, 1020, 480, 1020, NULL, NULL, 360, 720);
每个数值对应于以分钟为单位的开始或结束(即 360 -> 6:00 AM,1320 -> 10:00 PM;1320 和 360 之间的差异是 960 分钟,是设备上的有效可用性例如一天)。 “期间”表中的每条记录都不会跨越 2 个月或更长时间:只是 1 个月的一部分。 鉴于上述数据集,我想得到以下结果:
(Period, minutes_of availability)
('2020-10', 4800), <---- 1 Monday = 960 minutes + 1 Tuesday = 960 minuntes + 1 Wednesday = 960 minutes .....
('2020-11', 20160), <---- 5 Monday = 4800 minutes + 4 Tuesday = 3840 minutes + 4 Wednesday = 3840 minutes .....
('2020-12', 17220), <---- 3 Monday (until 23 December and before today) = 2880 minutes + 4 (until 23 December and before today) ..... 24 December ha a different availability, after 27 too
此外,计算应该在“当前日期”停止,所以我不想计算整个日历。 有人可以帮我解决这个问题吗? 我的数据库引擎是 SQL Server。
结束
【问题讨论】:
-
乐于助人,您研究过、尝试过什么并坚持不懈?
-
仅供参考的数据库有列,而不是字段。
-
发布 DDL,而不是您的表格的文字描述。与其强迫每个人猜测你是如何得出“1 个星期一 = 960 分钟 + ...”的,不如写出你使用的实际公式和所用值的来源。对你来说这似乎很明显,但对其他人来说可能不是。而且您似乎假设一行的日期不超过一个月的界限。这是一个安全的假设吗?该表是否有约束来保证它?如果不是,您仍然认为这是一个安全的假设吗?
-
“sysdate”是指
SysDateTime吗?这是否意味着您希望计算运行到当前时间,而不仅仅是日期? -
@Dale K,我不知道如何执行这样的“选择”。
标签: sql sql-server tsql