2012-07-25 185 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