我有一个存储过程,它在单行中为输入的单个日期提供结果集。存储的过程提供了闰年的详细信息和一些月份的详细信息。我想运行这个存储过程来提供 30 年后所有日期的详细信息,并将这些值插入到表中。
这就是我执行存储过程的方式 -
exec YDetail'20240116' -- given date
这给了我通过执行上述语句得到的以下结果集 -
日期 | 闰年? | 月 | 月份开始 | 本月总天数 |
---|---|---|---|---|
2024-01-16 | 闰年 | 1 | 2024-01-01 | 31 |
如果这是更简单的选择,我还可以修改存储过程。或者,我应该在 while 循环中执行存储过程吗?但我们如何才能实现这一目标呢?
这是我的存储过程 -
ALTER procedure [dbo].[YDetail]
(
@Date datetime
)
AS
BEGIN
declare @inputYear INT, @monthname varchar(10)
declare @answer Varchar(30), @totaldaysMonth int, @monthstart datetime
set @inputYear = YEAR(@Date)
IF (@inputYear % 400 = 0 OR (@inputYear % 4 =0 and not @inputYear % 100 = 0))
SET @answer = 'Leap year';
ELSE
SET @answer = 'Not a leap year';
SELECT @monthname = MONTH(@Date)
select @monthstart= dateadd(mm,datediff(mm,0,getdate()),0)
select @totaldaysMonth= datediff(dd,@monthstart,dateadd(mm,1,@monthstart))
select @Date 'Date', @answer 'LeapYear?', @monthname 'Month', @monthstart 'MonthStart', @totaldaysMonth as TotaldaysinMonth
END
您所要求的被称为日历表,创建它的方法有很多;这是一个:
with Cal as (
select dateadd(day, H*100+T*10+U, cast(getdate() as date) ) as Dte
from ( values (0),(1),(2)) H(H)
cross join
( values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) T(T)
cross join
( values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) U(U)
)
select
Dte
, case when datepart(dayOfYear,DATEFROMPARTS(2020,12,31))=366 then 'Leap Year' else '' end, Month(Dte) as Mth
, dateadd(day, -day(Dte)+1, Dte) as MthStart
, day(EOMONTH(Dte)) as DaysInMonth
from Cal
order by 1