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

SQL Stored Procedure Insert All Dates From Current Month Not In

我有 2 table

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

例子

Person table 持有:

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

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

declare @date datetime
set @date =  cast(YEAR(GETDATE()) as nvarchar(4)) +  RIGHT('00' +     cast(Month(GETDATE()) as nvarchar(2)), 2) + '01';

with d as (
    select @date as Date
    union all
    select dateadd(dd,1,Date)
    from d
    where month(date) = month(@Date)
)
select d.date 
from d 
where month(date) = month(@Date)

@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