如何在某个范围内制作特定日期时间数据的临时表?



我正在尝试在一定时间内创建一个时间表的临时表(id int,开始日期时间,结束日期时间(。因此,它将填充一个范围内的特定类型的时间 - 即在9-1-2019和9-13-2019之间,所有星期一和星期二,开始时间为上午10点,结束时间为60分钟后。

所以,使用这些例子,我会得到

1/9-2-2019 10 am/9-2-2019 11am
2/9-3-2019 10 am/9-3-2019 11am
3/9-9-2019 10 am/9-9-2019 11am
4/9-10-2019 10 am/9-10-2019 11am

最好的方法是什么?

一种方法使用递归 CTE。 例如,对于您的示例:

with cte as (
select convert(datetime, '2019-09-01') as dte
union all
select dateadd(day, 1, dte)
from cte
where dte < '2019-09-13'
)
select dateadd(hour, 10, dte),
dateadd(hour, 11, dte)
from cte
where datename(weekday, dte) in ('Monday', 'Tuesday');

如果 CTE 生成的行超过 100 行,则需要向查询添加option (maxrecursion 0)

只是另一种方法可以做到这一点

WITH C AS
(
SELECT DATEADD(Hour, 10, DATEADD(Day, V-1, '2019-09-01')) StartDate,
DATEADD(Hour, 11, DATEADD(Day, V-1, '2019-09-01')) EndDate
FROM
(
VALUES (1),
(2),
(3),
(4),
(5),
(6),
(7),
(8),
(9),
(10),
(11),
(12),
(13)
) T(V)
)
SELECT *
FROM C
WHERE DATENAME(WeekDay, StartDate) IN ('Monday', 'Tuesday');

如果你想创建临时表直接使用

SELECT IDENTITY(INT, 1, 1) ID,
StartDate,
EndDate
INTO #schedule_times
FROM C
WHERE DATENAME(WeekDay, StartDate) IN ('Monday', 'Tuesday');

最新更新