【问题标题】:How do I write this logic of C#'s datetime difference in SQL Server?如何在 SQL Server 中编写 C# 日期时间差异的逻辑?
【发布时间】:2012-05-31 15:19:27
【问题描述】:

我的 C# 代码中有这个逻辑,它给了我两次之间的时间差

示例输入为: '12:00 AM' - '11:15 AM' 给出 45 分钟。

DateTime startTime = Convert.ToDateTime(startTimeHH + ":" + startTimeMM + " " + startTimeAMPM);
DateTime endTime = Convert.ToDateTime(endTimeHH + ":" + endTimeMM + " " + endTimeAMPM);
DateTime breakTime = Convert.ToDateTime(breakTimeHH + ":" + breakTimeMM);

TimeSpan hours = endTime.Subtract(startTime);
hours = hours.Subtract(breakTime.TimeOfDay);

我在 SQL Server 中引用了一些 MSDN 文档日期时间函数,但找不到这些函数可以让我从输入中获得时间为 12:00 PM

但是现在我需要将这部分移到 SQL Server 中。怎么写?

示例输入为: '12:00 AM' - '11:15 AM' 不会返回 45 它返回 75 (它包含 15 作为 25)

【问题讨论】:

    标签: c# .net sql-server sql-server-2008


    【解决方案1】:

    这是获得看起来像 .NET TimeSpan 的一种方法:

    declare @startTimeHH char(2) = '10',
            @startTimeMM char(2) = '30',
            @startTimeAMPM char(2) = 'AM',
            @endTimeHH char(2) = '12',
            @endTimeMM char(2) = '00',
            @endTimeAMPM char(2) = 'PM',
            @breakTimeHH char(2) = '01',
            @breakTimeMM char(2) = '15',
            @startTime DateTime, 
            @endTime DateTime, 
            @breakTime DateTime, 
            @result Time
    
    set @startTime = cast ((@startTimeHH + ':' + @startTimeMM + ' ' + @startTimeAMPM) as Time);
    set @endTime = cast ((@endTimeHH + ':' + @endTimeMM + ' ' + @endTimeAMPM) as Time);
    set @breakTime = cast ((@breakTimeHH + ':' + @breakTimeMM) as Time);
    
    set @result = @endTime - @startTime - @breakTime
    select cast(@result as CHAR(8))
    

    结果是00:15:00

    【讨论】:

    • 嗨 schellack,我喜欢你的回答。然而这是我的错误。请看我的编辑。它不会返回 45 但会返回 75。它假定 15 为 25。它返回 100 而不是 60。你能修改你的答案吗?
    • 好的,我自己想出来的。这个效果很好: select CAST(LEFT(cast(@result as CHAR(8)),2) + '.' + CAST(CAST( CAST(RIGHT(LEFT(cast(@result as CHAR(8)),5 ),2) as CHAR(2)) as float) * 100/60 as varchar(2)) as float)
    【解决方案2】:
    CREATE TABLE [dbo].#events (            
        [StartTime] time NULL,            
        [EndTime] time NULL )            
    
    INSERT INTO #events            
    VALUES            
    ('08:00', '08:30'),            
    ('08:30', '08:00'),            
    ('09:00', '10:00'),            
    ('15:00', '16:30')  
    
    select  convert(time, dateadd(minute, datediff(minute, StartTime, EndTime), 0))  
    From #events
    
    drop table #events
    

    结果集

    00:30:00.0000000
    23:30:00.0000000
    01:00:00.0000000
    01:30:00.0000000

    【讨论】:

      【解决方案3】:

      使用DateDiff函数

      DatePart 也很方便

      【讨论】:

        【解决方案4】:

        这是一些返回“45”(分钟)的 SQL

        DECLARE @Start DATETIME, @END DATETIME
        SET @Start = '2009-05-02 10:00:50'
        set @End = '2009-05-02 10:45:50'
        
            -- FYI
        SELECT @start, @end
        
            -- returns 45
        SELECT DateDiff(mi, @start, @end)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-01-08
          • 1970-01-01
          • 2023-03-08
          • 1970-01-01
          • 2018-05-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多