如何在 SQL Server 中编写 C# 的日期时间差异的逻辑

本文关键字:日期 时间差 SQL Server | 更新日期: 2023-09-27 18:35:59

我的 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服务器中引用了一些MSDN文档日期时间函数,但找不到这些函数,这些函数可以给我时间从输入中12:00 PM

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

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

如何在 SQL Server 中编写 C# 的日期时间差异的逻辑

下面是获取看起来像 .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

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

使用 DateDiff 函数

日期部分也会很方便

下面是一些返回"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)