【问题标题】:Select Start date that is 60 business days old选择 60 个工作日前的开始日期
【发布时间】:2014-08-29 18:40:45
【问题描述】:

我需要能够选择比当前日期早 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 不是。

【问题讨论】:

标签: sql sql-server tsql


【解决方案1】:

我们对您的日历表了解不多,但您可以这样做。使用仅包含小于今天日期的工作日的派生表,并为每个工作日提供按日期降序排列的行号。然后从第 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

【讨论】:

  • 我可能会使用它并将 WHERE 子句更改为 Nonbus = 0,这将有效地给我工作日(尽管我认为在某些时候添加 Busday 列会有所帮助)。我会尝试实现这一点。
  • @MikeMarshall 我使用列名只是为了给您一个想法,因为我们不知道您的日历表是​​如何设置的。逻辑应该起作用。我在自己的数据库和日历表上对其进行了测试。
  • 正是我需要的。谢谢!
猜你喜欢
  • 2013-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-10
相关资源
最近更新 更多