我想遍歷表有兩個日期列
我的桌子喜歡
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
uj5u.com熱心網友回復:
給定一個計數表(一個帶有單個整數列的表,可以達到無數或任何你需要的),你可以使用兩個日期之間的天數交叉連接它:
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])
uj5u.com熱心網友回復:
每個資料庫都應該有一些理貨表來解決這些問題......
一般事實是,“在 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 識別符號(表名、列名...)是一個壞主意!
uj5u.com熱心網友回復:
您可以通過遞回 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身份證 | DT -: | :-------------- 1 | 2021-01-01 00:00:00.000 1 | 2021-01-02 00:00:00.000 1 | 2021-01-03 00:00:00.000 1 | 2021-01-06 00:00:00.000 1 | 2021-01-07 00:00:00.000 2 | 2021-02-01 00:00:00.000 2 | 2021-02-02 00:00:00.000
db<>在這里擺弄
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/323658.html
標籤:sql sql-server
上一篇:僅當它是日期值時才轉換為日期時間
