2013-02-28 55 views
2

我在Excel中有一个计算两个日期之间有多少星期日的公式,但我想在SQL中执行相同的操作,但无法弄清楚如何执行此操作。你能帮我吗?将Excel Formual转换为SQL

=SUM(INT((WEEKDAY(A1-8,1)+B1-A1)/7)) 

Declare @From as Datetime 
Declare @To as Datetime 

Set @From = '7 Jan 2013' 
Set @To = '18 Mar 2013' 

SELECT SUM(WEEKDATE(@From-8,1)+ @[email protected])/7)) AS No_Of_Sundays 
FROM TIME 

感谢

韦恩

回答

2

试试这个:

SELECT SUM((CASE WHEN DATEPART(dw, @From) = 7 THEN 1 ELSE 0 END) + DATEDIFF(dd, @From, @To)/7) AS No_Of_Sundays 

正如你看到的,这取决于本地化 - >俄罗斯星期日是一天#7,所以我们做一个检查,如果第一天是星期日

下面是另一种解决方案:

Declare @From as Datetime 
Declare @To as Datetime 
Declare @sundays as INT 

Set @From = '1/02/2013' 
Set @To = '28/02/2013' 
Set @sundays = 0 

WHILE (@From <= @To) 
BEGIN 
    SET @sundays = @sundays + (CASE WHEN DATEPART(dw, @From) = 7 THEN 1 ELSE 0 END) 
    SET @From = DATEADD(dd, 1, @From) 
END 

SELECT @sundays 
+0

塞尔吉奥嗨,什么是错的,因为它不包括所有的星期天,例如在二月份有4个,但SQL计数3 – wafw1971 2013-02-28 09:52:26

+0

编辑 - 红粉另一种解决方案that'l工作just perfect – Sergio 2013-02-28 10:04:49

+0

我收到此错误消息: 消息242,级别16,状态3,行6 将varchar数据类型转换为日期时间数据类型导致超出范围的值。 – wafw1971 2013-02-28 10:09:38

0

如果您使用sql-server 2005或更高版本,这是一种使用CTE的方法。这里是一个demo

declare @From date = '20130107' --'7 Jan 2013' 
declare @To date = '20130318' --'18 Mar 2013' 

;with CTE as (
    select 0 number , datename(weekday, @from) dName 
    union all 
    select number+1, datename(weekday,dateadd(day,number+1,@from)) dName 
    from CTE 
    where dateadd(day, number + 1,@from) <= @to and 
     datename(weekday,dateadd(day,number,@from)) <> 'sunday' 
) 

select top(1) (datediff(day,@from,@to) - number)/7 + 
       case when number = 0 and dname <> 'sunday' then 0 else 1 end 
       sundays 
from CTE 
order by number desc