我正在根據我寫的查詢中給出的值準備下一個 5 個月的日期。
DECLARE @StartDate DATETIME = '2022-03-31', @monthadd INT = 5;
; WITH dates AS (
SELECT @StartDate [vade]
UNION ALL
SELECT DATEADD(MONTH,1,[vade])
FROM dates
WHERE DATEADD(MONTH,1,[vade]) <= DATEADD(MONTH,@monthadd,@StartDate)
)
SELECT *
FROM dates
OPTION (MAXRECURSION 0)
GO
但是,當月的最后一天是 31 時,需要列出接下來幾個月的最后一天,也就是最近的一天。我該怎么做呢?
實際結果
| 韋德 |
|---|
| 2022-03-31 00:00:00.000 |
| 2022-04-30 00:00:00.000 |
| 2022-05-30 00:00:00.000 |
| 2022-06-30 00:00:00.000 |
| 2022-07-30 00:00:00.000 |
| 2022-08-30 00:00:00.000 |
編輯:
This is a maturity plan. If the person makes installments on the 31st of the month, the payment must be made on the last day of each month. If he does it on the 30th, the month should have 30 if it has 30 days, 30 if it has 31 days, and 29 if it has 29 days. If maturity starts on the 20th, it must be the 20th of each month. Imagine you take out a loan on the 30th of the month. If the month is 29 days, they will ask you to pay on the 29th day, and if the month is 31 days, they will ask you to pay on the 30th day. I know it's very confusing and I'm sorry about that.
uj5u.com熱心網友回復:
如果我理解正確,您希望每個月回傳相同的“日” -除非@StartDate 是該月的最后一天。
一種方法是確定@StartDate 是否是該月的最后一天。如果是,則使用E??OMONTH()回傳隨后每個月的最后一天。否則,使用 DATEADD() 回傳每個月中指定的“天”。這種方法應該適用于任何日期。
-- Note: Using 12 months for demo only
DECLARE @StartDate DATE = '2022-03-31';
DECLARE @EndDate DATE = DATEADD(MONTH, 12, @StartDate);
; WITH dates AS (
SELECT @StartDate [vade], IIF(@StartDate = EOMONTH(@StartDate), 1, 0) AS UseEOM
UNION ALL
SELECT IIF(UseEOM = 1
, EOMONTH(DATEADD(MONTH, 1,[vade]))
, DATEADD(MONTH, 1,[vade])
), UseEOM
FROM dates
WHERE [vade] < @EndDate
)
SELECT [vade]
FROM dates
OPTION (MAXRECURSION 0)
2022-03-31 (每月最后一天)的結果
| 韋德 |
|---|
| 2022-03-31 |
| 2022-04-30 |
| 2022-05-31 |
| 2022-06-30 |
| 2022-07-31 |
| 2022-08-31 |
| 2022-09-30 |
| 2022-10-31 |
| 2022-11-30 |
| 2022-12-31 |
| 2023-01-31 |
| 2023-02-28 |
| 2023-03-31 |
2022 年 3 月 22 日的結果 (不是本月的最后一天)
| 韋德 |
|---|
| 2022-03-22 |
| 2022-04-22 |
| 2022-05-22 |
| 2022-06-22 |
| 2022-07-22 |
| 2022-08-22 |
| 2022-09-22 |
| 2022-10-22 |
| 2022-11-22 |
| 2022-12-22 |
| 2023-01-22 |
| 2023-02-22 |
| 2023-03-22 |
db<>在這里擺弄
uj5u.com熱心網友回復:
該DATEADD函式已經考慮到了極端情況,比如月底,所以你不需要處理它。
為了獲得更簡潔的代碼,您可以撰寫一個stored procedure, 創建(或替換)一個dates_list表,然后回圈添加到開始日期的月數。
DELIMITER //
CREATE OR REPLACE PROCEDURE create_dates_list (
IN start_date DATETIME,
IN num_months INT
)
BEGIN
DECLARE idx INT DEFAULT 0;
CREATE OR REPLACE TABLE dates_list (
date DATE
);
WHILE idx <> num_months DO
INSERT INTO tab VALUES(
DATEADD(@start_date, INTERVAL @idx MONTH)
);
SET idx = idx 1;
END WHILE;
END //
DELIMITER ;
當您需要獲取新日期時,您可以通過設定引數并呼叫存盤程序來重繪 該表:
DECLARE @StartDate DATETIME = '2022-03-31', @monthadd INT = 5;
CALL create_dates_list(@StartDate, @monthadd);
您可以隨時使用 sql 賦予您的工具自由訪問該表。
如果您不需要該表存在以進行進一步的會話,則可以將表定義為TEMPORARY. 臨時表的官方檔案非常詳細和全面的示例,請查看以了解更多資訊。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/454748.html
標籤:sql sql-server dateadd
