Prz*_*ela 2 sql sql-server algorithm date intervals
我有两个列的表,如下所示:
+-----------+------------+
| FROM | TO |
+-----------+------------+
|2015-03-01 | 2015-03-04 |
|2015-03-05 | 2015-03-09 |
+-----------+------------+
Run Code Online (Sandbox Code Playgroud)
我想写一个函数,它将采用两个参数 - DateFrom和DateTo,并检查这个间隔.例如,如果函数接受DateFrom = 2015-03-03,并且DateTo = 2015-03-08作为参数应该返回true,因为此间隔中的每一天都在表中.
但如果表是这样的:
+-----------+------------+
| FROM | TO |
+-----------+------------+
|2015-03-01 | 2015-03-04 |
|2015-03-06 | 2015-03-09 |
+-----------+------------+
Run Code Online (Sandbox Code Playgroud)
函数应该返回false,因为2015-03-05不在表中.算法的任何想法?谢谢你的帮助.
如果您还没有日历表,可以使用计数表:
DECLARE @t TABLE
(
FromDate DATE ,
ToDate DATE
)
INSERT INTO @t
VALUES ( '2015-03-01', '2015-03-04' ),
( '2015-03-05', '2015-03-09' )
DECLARE @from DATE = '2015-03-03', @to DATE = '2015-03-08'
;WITH cte1 AS(SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS d
FROM (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) a(n)
CROSS JOIN (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) b(n)
CROSS JOIN (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) c(n)),
cte2 AS(SELECT DATEADD(dd, d - 1, @from) AS d
FROM cte1
WHERE DATEADD(dd, d - 1, @from) <= @to)
SELECT CASE WHEN EXISTS ( SELECT *
FROM cte2
WHERE NOT EXISTS ( SELECT *
FROM @t t
WHERE d BETWEEN t.FromDate AND t.ToDate ) )
THEN 0
ELSE 1
END AS IntervalExists
Run Code Online (Sandbox Code Playgroud)
它将适用于1000天差异的间隔.如果需要更多,只需添加更多cross joins(一个cross join将间隔乘以10).
| 归档时间: |
|
| 查看次数: |
95 次 |
| 最近记录: |