SQL存储过程插入当前月份的所有日期

时间:2015-03-15 03:28:54

标签: sql-server stored-procedures

我有2张桌子

  • Person,列PersonIDinteger
  • 表格CarePlanReport包含PersonID列(integer),Shift(nvarchar(5) - 将保留文字值'day'或'night'),{{1} (CarePlanDate),datetimeDetails

我需要一个存储过程,该过程将针对当前月份的所有日期,如果不是nvarchar(50),则为每个CarePlanReport(白班和夜班)插入2条记录已经存在。这是因为每个人都需要当月的每一天的白天和夜班记录。问题是可以在当月的任何一天添加新人,并且需要添加缺失的记录 - 因此该过程需要在任何给定月份中多次运行。现有记录将保持不变,因为它们已经存储了重要的详细信息。

实施例

Person.PersonID表持有:

Person

PersonId -------- 1 2 暂存当月

CarePlanReport

我用它来返回当月的所有日期(不确定它是否是最有效的方法)

PersonID   Shirt    CarePlanDate
----------------------------------
   1       day      2015/03/01
   2       day      2015/03/01
   1       night    2015/03/01
   2       night    2015/03/01
   .. and so on for each day in the month ....
   1       day      2015/03/31
   2       day      2015/03/31
   1       night    2015/03/31
   2       night    2015/03/31

1 个答案:

答案 0 :(得分:1)

@tfa

如果你编写一个触发器并且应该作为插入Person Table中的新记录调用它会很好。如果有任何需要,请告诉我。您必须在触发器中设置几组验证 使用以下程序,为每个personid插入“day”和“night”记录。只需要在一个月内调用一次。

create procedure [dbo].[InsertsRecords]
as
begin
DECLARE @DATE DATETIME
declare @NoOfDays int
declare @lv_count int =1
declare @LastDateOfMonth date 
declare @getdates date
declare @lv_personid  int
declare @FirstDateOfMonth date
SET @DATE=convert(date,getdate())
set @LastDateOfMonth =(select DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@date)+1,0)))
set @FirstDateOfMonth=(SELECT convert(date,DATEADD(mm, DATEDIFF(mm, 0, GETDATE()), 0)))
declare rcds_cur cursor  for
select personid from dbo.person where personid not in (select personid from dbo.CarePlanReport between 
@FirstDateOfMonth and @LastDateOfMonth )

open rcds_cur
FETCH NEXT FROM rcds_cur into @lv_personid
while @@FETCH_STATUS=0
begin
set @NoOfDays=( Select Day(EOMONTH(@DATE)) AS [Current Month])
set @NoOfDays=@NoOfDays-1
     while (@lv_count<=@NoOfDays)
     begin   
     set @getdates=(select DATEADD(dd,-@lv_count , @LastDateOfMonth))
     insert into dbo.CarePlanReport values (@lv_personid,'day',@getdates,'day shift')
     insert into dbo.CarePlanReport values (@lv_personid,'night',@getdates,'night shift')
     set @lv_count=@lv_count+1

     end
FETCH NEXT FROM rcds_cur into @lv_personid
end
close rcds_cur
deallocate rcds_cur
end