SQL 存储过程插入当前月份的所有日期不在
SQL Stored Procedure Insert All Dates From Current Month Not In
我有 2 table
- Table
Person
列 PersonID
(integer
)
- Table
CarePlanReport
列 PersonID
(integer
), Shift (nvarchar(5)
- 将保留文本值 'day' 或 'night' ), CarePlanDate
(datetime
), Details
(nvarchar(50)
)
我需要一个存储过程,它将为当月的所有日期插入 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
我有 2 table
- Table
Person
列PersonID
(integer
) - Table
CarePlanReport
列PersonID
(integer
), Shift (nvarchar(5)
- 将保留文本值 'day' 或 'night' ),CarePlanDate
(datetime
),Details
(nvarchar(50)
)
我需要一个存储过程,它将为当月的所有日期插入 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