2012-07-25 138 views
0

我是SQL新手,有人可以幫助將以下SQL語句轉換爲函數。這個聲明起作用,我只是不能創建一個函數。將SQL轉換爲函數

declare @start datetime, @end datetime 
set @start = '2012/07/25 09:00:00' 
set @end = '2012/07/25 12:55:00'; 

with weeks as (
    select @start as WeekStart 
    , dateadd(hh, 24, dateadd(dd, 0, datediff(dd, 0, dateadd(dd, 6 - (@@datefirst + datepart(dw, @start)) % 7, @start)))) as WeekEnd 
union all 
    select dateadd(hh, 48, WeekEnd) 
    , dateadd(hh, 24, dateadd(dd, 0, datediff(dd, 0, dateadd(dd, 13 - (@@datefirst + datepart(dw, WeekEnd)) % 7, WeekEnd)))) as WeekEnd 
    from weeks 
    where dateadd(hh, 48, WeekEnd) <= @end 
) 
select Seconds/(60 * 60) as Hours 
from (
    select sum(datediff(ss, WeekStart, case when @end < WeekEnd then @end else WeekEnd end)) as Seconds 
    from weeks) x 
+1

你會喜歡這個函數返回?您希望接受哪些參數?還有什麼我們可以爲你做的嗎?你已經發布了不完整的SQL,並沒有規定你真正在尋找什麼樣的輸出。請編輯您的問題,並提供有關您想要執行的操作的更多詳細信息,並添加其他缺少的SQL。很難從這篇文章中看出你想要獲得什麼。 – 2012-07-25 02:58:16

+0

感謝您的快速回復。此SQL語句以開始日期和結束日期爲準,並在它們之間返回我不包含週末的我。我用兩個變量複製了完整的SQL。所以我想這個函數接受兩個參數,StartDate和EndDate並返回我的小時數。 – 2012-07-25 03:02:46

回答

1

假設的SQL Server

create function CalculateHours 
(
    @Start datetime, 
    @End datetime 
) returns int 
as 
begin 
    declare @Hours int 
    ;with weeks as (
     select @start as WeekStart 
     , dateadd(hh, 24, dateadd(dd, 0, datediff(dd, 0, dateadd(dd, 6 - (@@datefirst + datepart(dw, @start)) % 7, @start)))) as WeekEnd 
    union all 
     select dateadd(hh, 48, WeekEnd) 
     , dateadd(hh, 24, dateadd(dd, 0, datediff(dd, 0, dateadd(dd, 13 - (@@datefirst + datepart(dw, WeekEnd)) % 7, WeekEnd)))) as WeekEnd 
     from weeks 
     where dateadd(hh, 48, WeekEnd) <= @end 
    ) 
    select @Hours = Seconds/(60 * 60) 
    from (
     select sum(datediff(ss, WeekStart, case when @end < WeekEnd then @end else WeekEnd end)) as Seconds 
     from weeks) x 

     return @Hours 
end 

使用例:

select dbo.CalculateHours('2012/07/25 09:00:00','2012/07/25 12:55:00') 
+0

感謝伯特,它像一個魅力。 – 2012-07-25 04:38:18