[英]Loop through two dates columns
我想遍历表有两个日期列
我的桌子喜欢
id from to
1 01/01/2021 03/01/2021
1 06/01/2021 07/01/2021
我期望结果为
id date
1 01/01/2021
1 02/01/2021
1 03/01/2021
1 06/01/2021
1 07/01/2021
给定一个计数表(一个带有单个整数列的表,可以达到无数或任何你需要的),你可以使用两个日期之间的天数交叉连接它:
with n as (select * from (values(0),(1),(2),(3),(4),(5))x(n)) /* represents a tally table */
select id, DateAdd(day,n.n,[from]) [date]
from t
cross join n
where n.n <= DateDiff(day,[from],[to])
您可以通过递归 CTE 查询展开此类日期范围
DROP TABLE IF EXISTS #t CREATE TABLE #t (Id int, Fromdate datetime , Todate datetime) INSERT INTO #t (Id, Fromdate, Todate) VALUES ( 1,'2021/01/01','2021/01/03'), ( 1,'2021/01/06','2021/01/07'), ( 2,'2021/02/01','2021/02/02')
WITH RCTE_DATES AS ( SELECT Id, FromDate, ToDate , 1 AS Lvl , FromDate AS Dt FROM #t UNION ALL SELECT Id, FromDate, ToDate , Lvl + 1 , DATEADD(day, 1, Dt) FROM RCTE_DATES WHERE Dt < ToDate ) SELECT Id, Dt FROM RCTE_DATES ORDER BY Id, Dt
\n身份证 | DT \n -: | :--------------\n 1 | 2021-01-01 00:00:00.000\n 1 | 2021-01-02 00:00:00.000\n 1 | 2021-01-03 00:00:00.000\n 1 | 2021-01-06 00:00:00.000\n 1 | 2021-01-07 00:00:00.000\n 2 | 2021-02-01 00:00:00.000\n 2 | 2021-02-02 00:00:00.000\n
db<> 在这里摆弄
每个数据库都应该有一些理货表来解决这些问题......
一般事实是,“在 RDBMS 数据库中,您只会检索已插入的数据”,您将永远找不到未放入数据库中的数据...
Pesonnaly 我曾经创建过一个数字表,还有一个日历表。 所有这些计数表在数据库利用之前填充一次,其中包含查询所需的所有行。
作为您的问题的一个例子,一个简单的表格,如:
CREATE TABLE T_CALENDAR (CLD_DATE DATE PRIMARY KEY);
DECLARE @D DATE = '2020-01-01';
WHILE @D < '2050-12-31'
BEGIN
INSERT INTO T_CALENDAR (CLD_DATE) VALUES (@D);
SET @D = DATEADD(day, 1, @D);
END;
最好的方法是将此表存储到只读存储(MS SQL Server 中的文件组)中,因为日期不会改变......这样可以避免锁定!
然后,解决您的查询是一项儿童工作:
SELECT CLD_DATE
FROM MyTable AS T
JOIN T_CALENDAR AS C ON T.MyDate BETWEEN "from" AND "to";
顺便说一句,使用 SQL 关键字作为 SQL 标识符(表名、列名...)是一个坏主意!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.