2013-02-28 54 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