その年に月の日数と月の名前を入力するプロシージャを作成する必要があります。これは、特定の年から始まり、終了年になります。たとえば、
YEAR MONTH DAYS
2015 JAN 31
2015 FEB 28
.
.
2015 DEC 30
そのように。これを行う方法を教えてください。私はこのように毎年の年間の合計月数と日数を決定することができます
declare @y int;
declare @cnt int = 2015;
set @y = 2012;
while @y<@cnt
begin
SELECT DATEDIFF(MONTH, cast(@y as char(4)), cast(@y+1 as char(4))) Months ,DATEDIFF(DAY, cast(@y as char(4)), cast(@y+1 as char(4))) Days ,@y Year
set @y = @y+1;
end;
これにより、年、その月数、および1年の日数がわかります。ただし、これを入力することはできません。
あなたが本当に心配する必要がある唯一の月は2月です。4で均等に割るほとんどの年はうるう年です(いくつかの例外があります)。
このクエリは月をハードコードします。再帰を使用した年のリストを生成するために、これはコピー/貼り付けできるためです。ただし、これを行うには、集計テーブルやカレンダーテーブルなど、より良い方法があります。どちらも強くお勧めします。
DECLARE @StartYear INT = 2000;
DECLARE @EndYear INT = 2020;
WITH
Years AS
(
SELECT
@StartYear AS Year
UNION ALL
SELECT
Year + 1
FROM
Years
WHERE
Year < @EndYear
)
SELECT
y.Year,
DaysInMonth.Month,
CASE
-- Feb logic based on: https://en.wikipedia.org/wiki/Leap_year#Algorithm
WHEN DaysInMonth.Month = 'Feb' THEN
CASE
WHEN y.Year % 4 = 0 AND y.Year % 100 = 0 AND y.Year % 400 = 0 THEN 29
WHEN y.Year % 4 = 0 AND y.Year % 100 <> 0 THEN 29
ELSE 28
END
ELSE DaysInMonth.Days
END
FROM
(
VALUES
('Jan', 31),
('Feb', 28),
('Mar', 31),
('Apr', 30),
('May', 31),
('Jun', 30),
('Jul', 31),
('Aug', 31),
('Sep', 30),
('Oct', 31),
('Nov', 30),
('Dec', 31)
) AS DaysInMonth (Month, Days)
CROSS JOIN Years AS y
;
これをプロシージャ内にラップするには:
CREATE PROCEDURE YourSchema.YourProcedureName
(
@StartYear INT,
@EndYear INT
)
AS
SET NOCOUNT ON;
WITH
Years AS
...
CROSS JOIN Years AS y
GO
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加