选择60个工作日的开始日期

时间:2014-08-29 18:40:46

标签: sql sql-server tsql

我需要能够选择当前日期之前60个工作日的开始日期。我有一个日历和营业日期等日历。我当前(和不成功)的方法如下:

DECLARE @Mode int
SET     @Mode = 0

SET     @StartDate = CASE WHEN @Mode = 0
                      THEN (SELECT BusDate FROM Leads.dbo.Calendar 
                            WHERE Date = DATEADD(DAY,DATEDIFF (DAY,0,GETDATE())-60,0))
                      WHEN @Mode = 1
                      THEN DATEADD(mm,DATEDIFF (mm,0,GETDATE())-2,0)
                      END

此方法可以追溯到60个日历日,而不是60个工作日。我正面临着将其归结为工作日的挑战。忽略Mode = 1部分(按月计算)。 任何帮助将不胜感激。

The Calendar table has the following fields:
SELECT [Date]
  ,[MMDDYYYY]
  ,[Year]
  ,[QTR]
  ,[Month]
  ,[Week]
  ,[YTDDay]
  ,[QTDDay]
  ,[MTDDay]
  ,[WeekDayNbr]
  ,[Quarter]
  ,[MonthLName]
  ,[MonthName]
  ,[DayOfWeekS]
  ,[DayOfWeek]
  ,[KindOfDay]
  ,[Description]
  ,[Period]
  ,[YrMo]
  ,[YrWk]
  ,[StartDate]
  ,[EndDate]
  ,[BusPeriod]
  ,[Holiday]
  ,[NonBus]
  ,[BusDaysInMonth]
  ,[BusDay]
  ,[BusDaysRemain]
  ,[BusDate]
  ,[YYYYMMDD]

BusDay是一个月的营业日(1,2,3等)。目前没有列表示1表示是,0表示否表示它是工作日,尽管我可以添加。 NonBus和Holiday字段以这样的方式运行:1是假日或非工作日(假日和周末),0不是。

1 个答案:

答案 0 :(得分:2)

我们对您的日历表了解不多,但您可以做这样的事情。使用仅包含工作日的派生表,该工作日小于今天的日期,并为每个工作日提供按日期desc排序的行号。然后从第60行选择日期。

select busdate
from 
    (
        select *,
        row_number() over (order by date desc) as dayNo
        from leads.dbo.calendar
        where nonBus = 0 -- Only business days
        and date < cast(getdate() as date)
    ) busDays
where dayno = 60