Sql 如何查找两个日期之间的所有周五和节假日
下表:Sql 如何查找两个日期之间的所有周五和节假日,sql,sql-server,tsql,sql-server-2000,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'
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时遇到了问题。如果您指定使用哪种编程语言,我们可能会在这里提供帮助。如果使用.NET,则应使用参数化查询而不是字符串替换
有关星期五,请参见以下问题:
见:
一张日历桌可以使它更有趣
更容易围绕任何问题开发解决方案
涉及日期的商业模式。
上次我检查时,这包括
几乎任何商业模式都可以
在某种程度上想想。常数
最终需要解决的问题
冗长、复杂、低效
方法包括:
问题:
x和y之间有多少个工作日?
3月的第二个星期二和4月的第一个星期五之间的所有日期是什么
我希望这批货什么时候到达
这个季度所有的星期五是几号
...
这将计算两个日期之间的星期五:
declare @from datetime= '2012-01-26'
declare @to datetime = '2012-01-28'
select datediff(day, -3, @to)/7-datediff(day, -2, @from)/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 )
有了这个表格,你可以像这样解决你的问题
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 )
选择该选项可帮助您:
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
在这件事上没有投票?其他解决方案是忽略区域设置。不管怎样,一切都很好!