繁体   English   中英

循环遍历两个日期列

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM