使用日历表计算一年中的财务周和一周中的工作日

时间:2013-06-18 04:51:56

标签: sql-server sql-server-2005

我有一张日历表:

CREATE TABLE [dbo].[FIN_CalendarTable](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [date] [datetime] NOT NULL,
    [fiscalStart] [datetime] NULL,
    [fiscalEnd] [datetime] NULL,
    [isHoliday] [int] NOT NULL,
    [isWorkday] [int] NOT NULL
 CONSTRAINT [PK_FIN_CalendarTable] PRIMARY KEY CLUSTERED 
(
    [id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

我想计算财政年度每周工作日的数量。我有以下查询返回财政周期和财政期间的每个工作日(250条记录):

    SELECT  dbo.CalendarTable.fiscalStart
      , dbo.CalendarTable.fiscalEnd
      , COUNT(*)
      , dbo.CalendarTable.monthOfYearName
      , dbo.CalendarTable.monthStart
      , dbo.CalendarTable.monthEnd
      , DATEDIFF(DAY, dbo.CalendarTable.fiscalStart, [date]) / 7 + 1 WeekOfFiscalYear
FROM    dbo.CalendarTable
WHERE   dbo.CalendarTable.isHoliday=0
          AND dbo.CalendarTable.isWorkday=1
        AND ( dbo.CalendarTable.date  >= CONVERT(DATETIME,'01/07/2012',103)
              AND dbo.CalendarTable.date <= CONVERT(DATETIME,'30/06/2013',103) ) 
GROUP BY dbo.CalendarTable.fiscalStart
      , dbo.CalendarTable.fiscalEnd
      , dbo.CalendarTable.monthOfYearName
      , dbo.CalendarTable.monthStart
      , dbo.CalendarTable.monthEnd
      , [dbo].[CalendarTable].[date]

我意识到这是因为包含了[dbo]。[CalendarTable]。[date]列。是否有更好的方法来构建此查询,以便返回52(或适当的53)记录,每个会计周的总工作日数?

我可以在应用程序中实现聚合,但是如果可能的话,希望获得更好的结果。

2 个答案:

答案 0 :(得分:0)

我宁愿尝试创建一个UDF,它会给我一些工作日或总周数,而不是尝试从查询本身获取此信息。您只有GROUP BY语句中的所有这些列,因此您可以计算记录数,并且可以使用UDF简化查询。

这是一篇文章,展示了如何计算工作日中两个日期之间的差异。 How to calculate difference between two dates in workdays

答案 1 :(得分:0)

  

是否有更好的方法来构造此查询以便52(或何时   适当的53)记录与总工作日一起返回   在每个财政周?

工作日的含义并不完全清楚,但如果你的意思是工作日,那么我认为你需要这些内容。

SELECT fiscalStart
     , fiscalEnd
     , sum(isWorkday)
FROM dbo.CalendarTable
WHERE date >= CONVERT(DATETIME,'01/07/2012',103)
  AND date <= CONVERT(DATETIME,'30/06/2013',103)
GROUP BY fiscalStart
       , fiscalEnd
ORDER BY fiscalStart

这假定,对于每个日期,“fiscalStart”表示会计周的第一天,“fiscalEnd”表示会计周的最后一天。如果这不是那些列的意思,请编辑您的问题,粘贴几周的INSERT语句以及预期的输出。