如何获得每月双周日期在SQL Server中的一年?(How to get biweekly dat

2019-09-29 07:53发布

我想,当我设置一个起始年,结束一年来生成双周日期。

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日适逢阳光下或坐,将上周五暴跌特定周。 等等......直到今年年底。

这是可以实现的? 或不?

谢谢!

Answer 1:

你的业务规则是不是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


Answer 2:

这是一个开始。 你将不得不调整的逻辑来得到你想要的结果。

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 


文章来源: How to get biweekly dates per month in a year in SQL Server?