2012-10-22 38 views
0

我需要一天的时间字符串值

“23:59:59”的工作,但会导致延迟

“24:00:00”是行不通的字符串值:错误将数据类型varchar转换为datetime。

“1.00:00:00”不工作:将数据类型varchar转换为datetime时出错。

这里是我的代码:

PROCEDURE [dbo].[Procedure1] 

    @Start datetime, 
    @Finish datetime, 
    @TimeRange datetime 
AS 
BEGIN 

    SET NOCOUNT ON; 

    declare @TimeRanges as TABLE (SessionStart datetime, SessionEnd datetime); 

    with TimeRanges as (
    select @Start as StartTime, @Start + @TimeRange as EndTime 
    union all 
    select StartTime + @TimeRange, EndTime + @TimeRange 
    from TimeRanges 
    where EndTime < @Finish) 
    select StartTime, EndTime, Count(Test.ScenarioID) as TotalPeaks 
    from TimeRanges as TR left outer join 
     dbo.Test as Test on TR.StartTime <= Test.SessionStartTime and Test.SessionCloseTime < TR.EndTime 
    group by TR.StartTime, TR.EndTime 
END 
+4

你为什么不使用DATEADD添加TIMERANGE? – Chris

+0

我将时间范围划分为特定时间,例如@TimeRange = 00:05:00.000,然后代码将其分成5分钟,并且工作正常,但是当我想要每日报告时,我需要使用“24:00:00.000”或类似“1.00:00:00.000”这意味着1天 – cihata87

回答

1

您正在尝试使用datetime类型为时间跨度类型,不会为你工作。

我建议你改变你的timerange参数为一个整数。然后指定它是秒,分,小时,天或其他。

如果你决定让天:

PROCEDURE [dbo].[Procedure1] 

    @Start datetime, 
    @Finish datetime, 
    @TimeRange int 
AS 
BEGIN 

    SET NOCOUNT ON; 

    declare @TimeRanges as TABLE (SessionStart datetime, SessionEnd datetime); 

    with TimeRanges as (
    select @Start as StartTime, DATEADD(day, @TimeRange, @Start) as EndTime 
    union all 
    select DATEADD(day, @TimeRange, StartTime), DATEADD(day, @TimeRange, EndTime) 
    from TimeRanges 
    where EndTime < @Finish) 
    select StartTime, EndTime, Count(Test.ScenarioID) as TotalPeaks 
    from TimeRanges as TR left outer join 
     dbo.Test as Test on TR.StartTime <= Test.SessionStartTime and Test.SessionCloseTime < TR.EndTime 
    group by TR.StartTime, TR.EndTime 
END 
+0

非常感谢你Tobsey – cihata87