【问题标题】:Exclude weekends days from the holidays从假期中排除周末
【发布时间】:2014-08-21 05:58:53
【问题描述】:

请假有以下数据:-

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 中排除(它在休假表和 datefrom 列中)

我该怎么做?

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 我编辑我的答案。您可以使用 DATEPART 来获取星期几。
    【解决方案2】:

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

    太阳 = 1,星期一 = 2,星期二 = 3,星期三 = 4,星期四 = 5,星期五 = 6,星期六 = 7

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

    【讨论】:

    • 它给出错误 - 关键字'between'附近的语法不正确
    • 这是你的吗? SELECT [NAME], sum(datediff(day, DATEFROM, case when dateto &gt; '2014-08-31' then '2014-08-31' else dateto end)+1) as holiday FROM [leave] where DATEFROM &gt;= '2014-08-01' and DATEFROM &lt;= '2014-08-31' and userid = 1 and DATEPART(dw, DATEFROM) BETWEEN 1 and 5 group by name
    • 我们需要有关您的表的更多详细信息...我在下面编写了 sql,它工作正常。 declare @leave table( EMPNO int , NAME varchar(max) , DATEFROM datetime , DATETO datetime , userid int ) insert into @leave select 111, 'xxx', '2014-08-03', '2014-09-05', 1 SELECT [NAME] , sum(datediff(day, DATEFROM, case when dateto &gt; '2014-08-31' then '2014-08-31' else dateto end)+1) as holiday FROM @leave where DATEFROM &gt;= '2014-08-01' and DATEFROM &lt;= '2014-08-31' and userid = 1 and DATEPART(dw, DATEFROM) BETWEEN 1 and 5 group by name
    • 对不起...我不知道如何添加换行符...我还是新人
    【解决方案3】:

    试试这个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'
    

    希望对你有帮助!

    【讨论】:

      【解决方案4】:

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

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

      此查询将从结果中排除所有星期五和星期六。查看 DateFirst 值 here 了解更多信息。

      【讨论】:

      • 它给出错误 - 关键字'not'附近的语法不正确
      • 你能用你正在使用的更新查询来更新你的问题吗?我假设 datefrom 是您表中的一列,其中 datetime 作为数据类型。
      【解决方案5】:

      检查一下

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多