gpt4 book ai didi

sql - 间隔表中的间隔

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:33:11 24 4
gpt4 key购买 nike

我有一个包含两列的表格:

+-----------+------------+
| FROM | TO |
+-----------+------------+
|2015-03-01 | 2015-03-04 |
|2015-03-05 | 2015-03-09 |
+-----------+------------+

我想编写一个函数,它接受两个参数——DateFrom 和 DateTo,并检查这个时间间隔。例如,如果函数将 DateFrom = 2015-03-03DateTo = 2015-03-08 作为参数,它应该返回 true,因为从这个间隔开始的每一天都在表中。

但是如果表格是这样的:

+-----------+------------+
| FROM | TO |
+-----------+------------+
|2015-03-01 | 2015-03-04 |
|2015-03-06 | 2015-03-09 |
+-----------+------------+

该函数应返回 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

它将在 1000 天差异的时间间隔内工作。如果需要更多,只需添加更多交叉连接(一个交叉连接会将间隔乘以 10)。

关于sql - 间隔表中的间隔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32754451/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com