如何找到两个日期之间的所有星期五和假日

时间:2012-01-26 08:21:19

标签: sql sql-server tsql sql-server-2000

表格:

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天

怎么做?

7 个答案:

答案 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)

  1. 对于假期,您的SQL看起来很好,您似乎无法将参数插入SQL。如果您指定了您正在使用的编程语言,我们可能会在这里提供帮助。如果使用.NET,则应使用参数化查询而不是字符串替换。

  2. 对于星期五,请看这个问题:

答案 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 )