将周末排除在节假日之外



table leave 有以下数据:

EMPNO   NAME    DATEFROM                   DATETO
111     xxx   2014-08-03  00:00:00.000    2014-09-05  00:00:00.000

现在我正在从 LEAVE 表中获取数据:

SELECT   [NAME],
         sum(datediff(day, DATEFROM, case 
                                         when dateto > '2014-08-31' then '2014-08-31'
                                         else dateto 
                                     end)+1) as holiday
FROM     [leave]
where    DATEFROM >= '2014-08-01'
         and DATEFROM <= '2014-08-31' 
         and userid = 1
group by name

它给了我以下完美的答案:-

NAME   holiday 
xxx     29

但我想将周末(周五和周六(排除在假期之外......但它必须从日期 2014-08-03 中排除(它在 LEAVE 表和 Datefrom 列中(

我该如何执行此操作?

您可以使用以下查询来计算两天之间的假期:

SELECT (DATEDIFF(WEEK,StartDate,EndDate)-1) * 2 +
        CASE DATEPART(dw,StartDate)
            WHEN 4 THEN 2
            WHEN 5 THEN 1
            ELSE 0
        END

你也可以使用 DATEPART(dw, DATEFROM) BETWEEN 1 and 5这会给你周日到周四。

周日 = 1,周一 = 2,周二 = 3,周三 = 4,周四 = 5,周五 = 6,周六 = 7

但是,我认为与日期相关的数字可能与您的系统设置有关

试试这个DATENAME()函数:

select [your_date_column]
from table
where DATENAME(WEEKDAY, [date_created]) <> 'Friday' 
  and DATENAME(WEEKDAY, [date_created]) <> 'Saturday'
  and DATENAME(WEEKDAY, [date_created]) <> 'Sunday'

希望这对你有帮助!

在查询中添加以下 where 子句应该会有所帮助:

DATEPART(dw,datefrom) not in(5,6)

此查询将从结果中排除所有星期五和星期六。有关详细信息,请查看此处的 DateFirst 值。

检查一下

SELECT   [NAME],
         sum(datediff(day, DATEFROM, case 
                                         when dateto > '2014-08-31' then '2014-08-31'
                                         else dateto 
                                     end)+1) as holiday
FROM     [leave]
where    DATEFROM >= '2014-08-01'
         and DATEFROM <= '2014-08-31' 
         and userid = 1 and datepart(dw,DATEFROM)<>6 and datepart(dw,DATEFROM)<>7
group by name

最新更新