【问题标题】:How to find all fridays and holidays between two dates如何查找两个日期之间的所有星期五和节假日
【发布时间】:2012-01-26 08:21:18
【问题描述】:

桌子:

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' 

我还想找出两个日期之间的星期五。

对于查找星期五,如何创建查询?

预期输出:

Holiday Friday

2       5

[2] - 表 1 放假 2 天,[5] - 周五放假 5 天

如何做到这一点?

【问题讨论】:

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


    【解决方案1】:

    这计算两个日期之间的星期五:

    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?

    【讨论】:

      【解决方案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
      

      【讨论】:

        【解决方案3】:

        见:

        Why should I consider using an auxiliary calendar table?

        日历表可以做很多事情 更容易围绕任何开发解决方案 涉及日期的商业模式。 最后我检查了一下,这包括 几乎任何商业模式都可以 想一想,在某种程度上。持续的 最终需要的问题 冗长、复杂和低效 方法包括以下 问题:

        • x 和 y 之间有多少个工作日?
        • 3 月的第二个星期二和 4 月的第一个星期五之间的所有日期是什么时候?
        • 这批货物应该在什么日期到达?
        • 本季度所有星期五的日期是什么?
        • ...

        【讨论】:

        • 对此没有赞成票?其他解决方案忽略了区域设置。反正没事没事没事!
        【解决方案4】:
        1. 对于假期,您的 SQL 看起来不错,只是您似乎在将参数插入 SQL 时遇到了麻烦。如果您指定您使用的编程语言,我们可能会在这里提供帮助。如果您使用 .NET,则应使用参数化查询而不是字符串替换。

        2. 周五,请看这个问题:

        【讨论】:

          【解决方案5】:
          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)
          

          【讨论】:

            【解决方案6】:
            select count(Holiday) as holiday
            from Table1
            where date between start_date AND end_date
            

            【讨论】:

              【解决方案7】:

              我们用额外的时间表解决了这个问题。这看起来像这样

              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 )
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2011-06-25
                • 1970-01-01
                • 2017-07-26
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2017-05-02
                相关资源
                最近更新 更多