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