我想,当我设置一个起始年,结束一年来生成双周日期。
DECLARE @StartYear DATETIME
DECLARE @EndYear DATETIME
SET @StartYear = '01/01/2017'
SET @EndYear = '12/31/2017'
然后,T-SQL应计算双周日期,例如:2017年3月15日和2017年3月30日是发薪日。
此外,如果日期落在周六和周日,那么就会产生日期以它的第一个星期五。
希望有人能够帮助我。 或者有人愿意分享他/她对这个知识和公式。
UPDATE:我预期的结果如下:
当我进入2017年1月1日,然后它会自动生成每15天。
例:
@StartYear: 01/01/2017
结果应该是:
DatesBiweeklyPerMonthInAYear
-------------------------------
01/13/2017 (since the 15th day falls on sunday)
01/30/2017
02/15/2017
02/28/2017 (since no 30th day)
如果15日适逢阳光下或坐,将上周五暴跌特定周。 等等......直到今年年底。
这是可以实现的? 或不?
谢谢!
你的业务规则是不是100%清楚。
我认为可以有不止一个正确的结果。
在一个地方,它是硬编码,因为我想确保的要求100%。 我不使用cursor.Its只有24环。
declare @StartYear datetime='2017-01-01'
declare @endYear datetime ='2017-12-31'
declare @gap int =14 --Bimonthly means gap of 14 days or 15 days whatever
;With CTE as
(
select dateadd(day,@gap, @StartYear) Bimonthly
,1 rn
UNION ALL
select
case
when (rn+1)%2=0 and datename(m, Bimonthly)='February' THEN
'2017-02-28'
when (rn+1)%2=0 and datename(m, Bimonthly)!='February'
then dateadd(day,@gap, Bimonthly)
else
dateadd(day,@gap, dateadd(month, datediff(month,0,dateadd(month,1,Bimonthly)),0))
END
,rn+1
from cte
where rn< (datediff(month,@StartYear, @endYear)+1)*2
)
select
case WHEN datename(dw, Bimonthly)='Saturday' THEN
dateadd(day,-1, Bimonthly)
WHEN datename(dw, Bimonthly)='Sunday' THEN
dateadd(day,-2, Bimonthly)
else
Bimonthly
end
,rn
from cte
这是一个开始。 你将不得不调整的逻辑来得到你想要的结果。
DECLARE @MinDate DATE = '20170101',
@MaxDate DATE = '20171231';
DECLARE @date DATE;
DECLARE @counter INT = 0;
DECLARE my_cursor CURSOR LOCAL STATIC READ_ONLY FORWARD_ONLY FOR
SELECT TOP (Datediff(day, @MinDate, @MaxDate) + 1) Date =
Dateadd(day, Row_number()
OVER(
ORDER
BY a.object_id) - 1, @MinDate)
FROM sys.all_objects a
CROSS JOIN sys.all_objects b;
OPEN my_cursor
FETCH next FROM my_cursor INTO @date
WHILE @@FETCH_STATUS = 0
BEGIN
IF( @counter = 15 )
BEGIN
PRINT @date -- here is where you get the 15th date
SET @counter = 0
END
SET @counter = @counter + 1
FETCH next FROM my_cursor INTO @date
END
CLOSE my_cursor
DEALLOCATE my_cursor