运行一个存储过程以在未来的所有日期(从现在起 30 年后)执行。但存储过程只接受单个日期作为输入

问题描述 投票:0回答:1

我有一个存储过程,它在单行中为输入的单个日期提供结果集。存储的过程提供了闰年的详细信息和一些月份的详细信息。我想运行这个存储过程来提供 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 
sql sql-server t-sql while-loop ssms
1个回答
0
投票

您所要求的被称为日历表,创建它的方法有很多;这是一个:

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
© www.soinside.com 2019 - 2024. All rights reserved.