【问题标题】:T-SQL Work days in current quarter and work days passed in current quarter当前季度的 T-SQL 工作日和当前季度过去的工作日
【发布时间】:2018-11-17 00:05:12
【问题描述】:

除了当前季度到目前为止已经过去了多少工作日之外,最好的方法是提取当前季度的工作日数(周一至周五)?这是用于 T-SQL/MS SQL

我有当前的总天数,只需要删除周末...

datediff(dd, dateadd(qq, datediff(qq,0, getdate()),0), dateadd(qq, datediff(qq,0, getdate()) + 1 ,0)) as [Days in Quarter]

【问题讨论】:

  • 您现有的查询告诉我这是 T-SQL,它可能是 MS SQL Server 或 Sybase。创建查询时,始终将数据库指定为标签。 “SQL”是查询标准,不是数据库名称。
  • 日历表。当您说工作日时,您是指周一至周五吗?假期呢? stackoverflow.com/questions/1201874/…

标签: sql date


【解决方案1】:

一种方法如下:

select
       dates.*

     , (DATEDIFF(dd, startofperiod, endofperiod) + 1)
      -(DATEDIFF(wk, startofperiod, endofperiod) * 2)
      -(CASE WHEN DATENAME(dw, startofperiod) = 'Sunday' THEN 1 ELSE 0 END) 
      -(CASE WHEN DATENAME(dw, endofperiod) = 'Saturday' THEN 1 ELSE 0 END)
      as wkdaysinperiod

     , (DATEDIFF(dd, startofperiod, today) + 1)
      -(DATEDIFF(wk, startofperiod, today) * 2)
      -(CASE WHEN DATENAME(dw, startofperiod) = 'Sunday' THEN 1 ELSE 0 END) 
      -(CASE WHEN DATENAME(dw, today) = 'Saturday' THEN 1 ELSE 0 END)
      as wkdaystodate
from (
    select 
          dateadd(qq, datediff(qq,0, getdate()),0)                     as startofperiod
        , dateadd(dd,-1,dateadd(qq, datediff(qq,0, getdate()) + 1 ,0)) as endofperiod
        , convert(date,getdate()) as today
    ) as Dates
;

上面看到的方法假设使用英语,所以如果不适合模数可以用来删除该依赖关系,如下所示。

SQL Server 中的“基准日期”是 1900-01-01,即星期一,因此自该日期除以 7、0 后的剩余天数为星期一、1、星期二、... 6 星期日。无论服务器 datefirst 设置如何,都是如此。

select
       dates.*, ca.*

     , (DATEDIFF(dd, startofperiod, endofperiod) + 1)
      -(DATEDIFF(wk, startofperiod, endofperiod) * 2)
      -(CASE WHEN periodstartdaynum = 6 THEN 1 ELSE 0 END) /* Sunday */
      -(CASE WHEN periodenddaynum   = 5 THEN 1 ELSE 0 END) /* Saturday */
      as wkdaysinperiod

     , (DATEDIFF(dd, startofperiod, today) + 1)
      -(DATEDIFF(wk, startofperiod, today) * 2)
      -(CASE WHEN periodstartdaynum = 6 THEN 1 ELSE 0 END) /* Sunday */
      -(CASE WHEN todaydaynum       = 5 THEN 1 ELSE 0 END) /* Saturday */
      as wkdaystodate
from (
    select 
          dateadd(qq, datediff(qq,0, getdate()),0)                     as startofperiod
        , dateadd(dd,-1,dateadd(qq, datediff(qq,0, getdate()) + 1 ,0)) as endofperiod
        , convert(date,getdate()) as today
    ) as Dates
cross apply (
    select
          datediff(dd,0,startofperiod) % 7 as periodstartdaynum
        , datediff(dd,0,endofperiod) % 7   as periodenddaynum
        , datediff(dd,0,today) % 7         as todaydaynum
    ) ca
;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-02
    • 1970-01-01
    • 2014-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多