从假期中排除周末

时间:2014-08-21 05:58:54

标签: sql sql-server sql-server-2008

表离开有以下数据: -

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

现在我从休假表中获取数据:

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日期开始排除(它在离开表和日期列中)

我该怎么做呢?

5 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

你也可以使用 DATEPART(dw, DATEFROM) BETWEEN 1 and 5星期四这会给你星期天。

sun = 1,mon = 2,tue = 3,wed = 4,thu = 5,fri = 6,sat = 7

但是,我认为当天的数字关系可能与您的系统设置有关

答案 2 :(得分:0)

尝试使用此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'

希望这可能会对你有帮助!

答案 3 :(得分:0)

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

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

此查询将从结果中排除所有星期五和星期六。检查DateFirst值here以获取更多信息。

答案 4 :(得分:0)

检查

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