我最近开始使用递归 CTE SQL 来根据需要生成这样的数据。下面的 SQL 生成具有开始日期和结束日期的数据日历。如果日期在 current_date 之前并且是星期六或星期日,我添加了一个额外的列来指示周末。
with recursive calendar (dte,num) as (
select CAST('1/1/2013' /* Start Date */ as date) as dte, CAST(1 as integer) as num from rdb$database
union all
select DATEADD(day,1,calendar.dte) as dte, calendar.num+1 as num from calendar
where DATEADD(day,1,calendar.dte) <= '1/31/2013' /* End Date */
)
select
calendar.*,
EXTRACT(weekday FROM calendar.dte) as wkday,
IIF(calendar.dte <= current_date and EXTRACT(weekday FROM calendar.dte) IN (0,6) /* Sunday & Saturday */,1,0) as wkdaytodate
from calendar
通过一些修改,您可以获得该月的单一结果。
with recursive calendar (dte,num) as (
select CAST('1/1/2013' /* Start Date */ as date) as dte, CAST(1 as integer) as num from rdb$database
union all
select DATEADD(day,1,calendar.dte) as dte, calendar.num+1 as num from calendar
where DATEADD(day,1,calendar.dte) <= '1/31/2013' /* End Date */
)
select
MIN(calendar.dte) as dte,
SUM(IIF(calendar.dte <= current_date and EXTRACT(weekday FROM calendar.dte) IN (0,6) /* Sunday & Saturday */,1,0)) as wkdaytodate
from calendar
如果您需要它更小,您可以简单地将其定义为单列。
select
'test' as text,
(
with recursive calendar (dte,num) as (
select CAST('1/1/2013' /* Start Date */ as date) as dte, CAST(1 as integer) as num from rdb$database
union all
select DATEADD(day,1,calendar.dte) as dte, calendar.num+1 as num from calendar
where DATEADD(day,1,calendar.dte) <= '1/31/2013' /* End Date */
)
select
SUM(IIF(calendar.dte <= current_date and EXTRACT(weekday FROM calendar.dte) IN (0,6) /* Sunday & Saturday */,1,0)) as wkdaytodate
from calendar
) as numofweekenddays
from rdb$database
其他人则表示,除了“工作日为周一至周五”的简单规则(如假期)之外,任何内容都应存储在日历表中,我同意这一点。