0

我的代码是:

SELECT 
    Sum(DR.TimeOfWork) "Skutečnost",
    SU.name "Jmeno"
FROM DevTimeRecords DR
left join SecurityUsers SU on SU.ID=DR.Worker_ID
left join DevBugs DB on DB.ID=DR.DevDocument_ID
left join DevProducts DPR on DPR.ID=DB.Product_ID
left join DevParts DPA on DPA.ID=DB.Part_ID
where
    SU.id = '@{_osoba}'
    and DPR.Code = 'ZP'
    and DPA.Code='A' 
    and not(DB.Status_ID IN ('TUPER00101','UUPER00101'))
group by
    SU.Name
order by
    SU.Name ASC

而且我需要添加列,其中将计算直到今天的工作日。例如:to today date 此列返回数字 18(每月 27 天 - 周末)。如何添加此列?

4

2 回答 2

3

我处理这个问题的方法是简单地使用我创建的日期为 2100 年的“日历”表,以及一个指示工作日真/假的字段。

它的技术含量很低,但很有效——一个优点是您可以将假期标记为非工作日,如果您的公司决定更改他们的假期,您可以更改一个表格,而不是所有计算它的语句。

于 2013-06-27T18:27:29.900 回答
0

我最近开始使用递归 CTE SQL 来根据需要生成这样的数据。下面的 SQL 生成具有开始日期和结束日期的数据日历。如果日期在 current_date 之前并且是星期六或星期日,我添加了一个额外的列来指示周末。

with recursive calendar (dte,num) as (
    select CAST('1/1/2013' /* Start Date */ as date) as dte, CAST(1 as integer) as num from rdb$database
    union all
    select DATEADD(day,1,calendar.dte) as dte, calendar.num+1 as num from calendar
    where DATEADD(day,1,calendar.dte) <= '1/31/2013' /* End Date */
)
select
    calendar.*,
    EXTRACT(weekday FROM calendar.dte) as wkday,
    IIF(calendar.dte <= current_date and EXTRACT(weekday FROM calendar.dte) IN (0,6) /* Sunday & Saturday */,1,0) as wkdaytodate
from calendar

通过一些修改,您可以获得该月的单一结果。

with recursive calendar (dte,num) as (
    select CAST('1/1/2013' /* Start Date */ as date) as dte, CAST(1 as integer) as num from rdb$database
    union all
    select DATEADD(day,1,calendar.dte) as dte, calendar.num+1 as num from calendar
    where DATEADD(day,1,calendar.dte) <= '1/31/2013' /* End Date */
)
select
    MIN(calendar.dte) as dte,
    SUM(IIF(calendar.dte <= current_date and EXTRACT(weekday FROM calendar.dte) IN (0,6) /* Sunday & Saturday */,1,0)) as wkdaytodate
from calendar

如果您需要它更小,您可以简单地将其定义为单列。

select
    'test' as text,
    (
        with recursive calendar (dte,num) as (
            select CAST('1/1/2013' /* Start Date */ as date) as dte, CAST(1 as integer) as num from rdb$database
            union all
            select DATEADD(day,1,calendar.dte) as dte, calendar.num+1 as num from calendar
            where DATEADD(day,1,calendar.dte) <= '1/31/2013' /* End Date */
        )
        select
            SUM(IIF(calendar.dte <= current_date and EXTRACT(weekday FROM calendar.dte) IN (0,6) /* Sunday & Saturday */,1,0)) as wkdaytodate
        from calendar
    ) as numofweekenddays

from rdb$database

其他人则表示,除了“工作日为周一至周五”的简单规则(如假期)之外,任何内容都应存储在日历表中,我同意这一点。

于 2013-07-01T20:52:56.923 回答