我有一个带有生效日期、停止日期和七个布尔字段的时间表表,指示使用该时间表的星期几。这是一个示例:
effDate discDate opMon opTue opWed opThu opFri opSat opSun
---------- ---------- ----- ----- ----- ----- ----- ----- -----
2012-10-28 2012-11-27 0 1 0 0 0 0 1
Run Code Online (Sandbox Code Playgroud)
我需要做的是为每个日期范围选择一个包含各个日期的表格,其中每条记录都是该范围内的一个日期。对于上面的数据集,它看起来像这样:
dates
----------
2012-10-28
2012-10-30
2012-11-04
2012-11-06
2012-11-11
2012-11-13
2012-11-18
2012-11-20
2012-11-25
2012-11-27
Run Code Online (Sandbox Code Playgroud)
由于某种原因,我似乎无法将我的大脑围绕在这个问题上。
小智 5
具有如下所示的天数生成器功能:
create FUNCTION [DateFuncs].[DateRange]
(
@DateFrom date,
@DateTo date
)
RETURNS TABLE
AS
RETURN
(
WITH Nbrs_3( n ) AS ( SELECT 1 UNION SELECT 0 ),
Nbrs_2( n ) AS ( SELECT 1 FROM Nbrs_3 n1 CROSS JOIN Nbrs_3 n2 ),
Nbrs_1( n ) AS ( SELECT 1 FROM Nbrs_2 n1 CROSS JOIN Nbrs_2 n2 ),
Nbrs_0( n ) AS ( SELECT 1 FROM Nbrs_1 n1 CROSS JOIN Nbrs_1 n2 ),
Nbrs ( n ) AS ( SELECT 1 FROM Nbrs_0 n1 CROSS JOIN Nbrs_0 n2 )
SELECT
dateadd(d,n-1,@DateFrom) as Date,
datepart(yyyy,dateadd(d,n-1,@DateFrom)) as YearNum,
datepart(mm,dateadd(d,n-1,@DateFrom)) as MonthNum,
datepart(dd,dateadd(d,n-1,@DateFrom)) as DayNum,
datepart(dw,dateadd(d,n-1,@DateFrom)) as WeekDayNum,
n-1 as Offset
FROM ( SELECT ROW_NUMBER() OVER (ORDER BY n)
FROM Nbrs )
D ( n )
WHERE n <= datediff(d,@DateFrom,@DateTo)+1
)
Run Code Online (Sandbox Code Playgroud)
检查以下查询
--preparation code
declare @data table
(
effDate date,
discDate date,
opMon bit,
opTue bit,
opWed bit,
opThu bit,
opFri bit,
opSat bit,
opSun bit
)
insert into @data (effDate,discDate,opMon,opTue,opWed,opThu,opFri,opSat,opSun)
values ('2012-10-28','2012-11-27',0,1,0,0,0,0,1)
-- your query
select
dr.Date
from
@data as da
cross apply
DateFuncs.DateRange(da.effDate,da.discDate) as dr
where
case
when dr.WeekDayNum=1 and da.opSun=1 then 1
when dr.WeekDayNum=2 and da.opMon=1 then 1
when dr.WeekDayNum=3 and da.opTue=1 then 1
when dr.WeekDayNum=4 and da.opThu=1 then 1
when dr.WeekDayNum=5 and da.opWed=1 then 1
when dr.WeekDayNum=6 and da.opFri=1 then 1
when dr.WeekDayNum=7 and da.opSat=1 then 1
end = 1
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
128 次 |
最近记录: |