表格:
hDate Holiday
17/12/2011 National Day
01/01/2012 New Year
....
从表格中,我想找到两个日期之间的假期总数:
如下的查询:
select count(hdate)
from table1
where hdate between '" & start_date & "' and '" & end_date & "'
用户输入:
start_date = '16/12/2011'
end_date = '15/01/2012'
而且我想找到2个日期之间的星期五。
如需查找星期五,如何创建查询?
预期产出:
Holiday Friday
2 5
[2] - 从表1,[5] - 周五5天假期2天
怎么做?
答案 0 :(得分:6)
这计算两个日期之间的星期五:
declare @from datetime= '2012-01-26'
declare @to datetime = '2012-01-28'
select datediff(day, -3, @to)/7-datediff(day, -2, @from)/7
假期很容易找到,看起来你已经有了这个部分。
我之前有点回答。但没有得到任何信任:
How to calculate the number of "Tuesdays" between two dates in TSQL?
答案 1 :(得分:2)
那个选择帮助你:
DECLARE @FROMDATE DATE = '2009-01-07'
DECLARE @TODATE DATE = '2012-01-26'
SELECT COUNT(*) holidays,(select COUNT(*) from table1 where DATEPART(DW, hdate) = 5
AND DT BETWEEN @FROMDATE AND @TODATE ) fridays FROM table1
WHERE hdate BETWEEN @FROMDATE AND @TODATE
答案 2 :(得分:1)
对于假期,您的SQL看起来很好,您似乎无法将参数插入SQL。如果您指定了您正在使用的编程语言,我们可能会在这里提供帮助。如果使用.NET,则应使用参数化查询而不是字符串替换。
对于星期五,请看这个问题:
答案 3 :(得分:1)
select count(Holiday) as holiday
from Table1
where date between start_date AND end_date
答案 4 :(得分:1)
DECLARE @StartDate DATETIME
DECLARE @EndDate DATETIME
SET @StartDate ='16/12/2011'
SET @EndDate = '15/01/2012'
SELECT
(DATEDIFF(dd, @StartDate, @EndDate) + 1)
-(DATEDIFF(wk, @StartDate, @EndDate) * 2)
-(CASE WHEN DATENAME(dw, @StartDate) = 'Friday' THEN 1 ELSE 0 END)
答案 5 :(得分:1)
请参阅:
Why should I consider using an auxiliary calendar table?
日历表可以做得更多 更容易开发任何解决方案 涉及日期的商业模式。 最后我查了一下,这包括了 几乎任何商业模式都可以 想到某种程度。不变 最终需要的问题 冗长,复杂,低效 方法包括以下内容 问题:
- x和y之间有多少个工作日?
- 3月的第二个星期二和4月的第一个星期五之间的所有日期是多少?
- 我应该在什么日期预计这批货物到货?
- 本季度所有星期五的日期是什么时候?
- ...
答案 6 :(得分:1)
我们使用额外的时间表来解决问题。这看起来像这样
ID | Date | Holiday | Year | CalendarWeek | DayName
1 | 17/12/2011 | 1 | 2011 | 50 | Monday
2 | 18/12/2011 | 0 | 2011 | 50 | Thursday
3 | 19/12/2011 | 0 | 2011 | 50 | Wendsday
使用此表,您可以像这样解决您的问题
select
(select count(d.DayName) from date_table as d
where d.DayName = 'Friday' and date >= start_date and date <= end_date ),
(select sum(d.Holiday) from date_table as d
where date >= start_date and date <= end_date )
这也应该与SQL Server 2000兼容。这适用于SQL Server 2005及更高版本:
with tmp(id) as
(
select id from from date_table where date >= start_date and date <= end_date
)
select
(select count(d.DayName) from date_table inner join tmp on tmp.id = id
where DayName = 'Friday' ),
(select sum(d.Holiday) from date_table inner join tmp on tmp.id = id )