【问题标题】:How to compare two dates to find time difference in SQL Server 2005, date manipulation如何在 SQL Server 2005 中比较两个日期以查找时差,日期操作
【发布时间】:2012-03-20 06:08:41
【问题描述】:

我有两列:

job_start                         job_end
2011-11-02 12:20:37.247           2011-11-02 13:35:14.613

如何使用 T-SQL 找到从作业开始到作业结束之间经过的原始时间量?

我试过了:

select    (job_end - job_start) from tableA

但结果是这样的:

1900-01-01 01:14:37.367

【问题讨论】:

  • 如您所见,DateTime 减法的结果是另一个日期,等于 1900.01.01 加上结果差,在您的情况下是 1:14:37.367.

标签: sql sql-server-2005 date datediff


【解决方案1】:

如果您试图准确地计算工作时间,试试这个(在 SQL Server 2016 中测试)

SELECT DATEDIFF(MINUTE,job_start, job_end)/60.00;

各种 DATEDIFF 功能包括:

SELECT DATEDIFF(year,        '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(quarter,     '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(month,       '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(dayofyear,   '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(day,         '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(week,        '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(hour,        '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(minute,      '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(second,      '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(millisecond, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');

参考:https://docs.microsoft.com/en-us/sql/t-sql/functions/datediff-transact-sql?view=sql-server-2017

【讨论】:

    【解决方案2】:

    我使用了以下逻辑,它对我很有效:

    CONVERT(TIME, DATEADD(MINUTE, DATEDIFF(MINUTE, AP.Time_IN, AP.Time_OUT), 0)) 
    

    【讨论】:

      【解决方案3】:

      看看DATEDIFF,这应该就是你要找的。它需要您比较的两个日期,以及您想要差异的日期单位(天、月、秒...)

      【讨论】:

        【解决方案4】:

        以下代码以 hh:mm 格式给出。

        选择 RIGHT(LEFT(job_end-job_start,17),5)

        【讨论】:

        • 我认为这并不是 OP 所要求的。使用 DATE_DIFF 应该会有所帮助...
        【解决方案5】:

        看看DateDiff()函数。

        -- Syntax
        -- DATEDIFF ( datepart , startdate , enddate )
        
        -- Example usage
        SELECT DATEDIFF(DAY, GETDATE(), GETDATE() + 1) AS DayDiff
        SELECT DATEDIFF(MINUTE, GETDATE(), GETDATE() + 1) AS MinuteDiff
        SELECT DATEDIFF(SECOND, GETDATE(), GETDATE() + 1) AS SecondDiff
        SELECT DATEDIFF(WEEK, GETDATE(), GETDATE() + 1) AS WeekDiff
        SELECT DATEDIFF(HOUR, GETDATE(), GETDATE() + 1) AS HourDiff
        ...
        

        你可以看到它在行动/play with it here

        【讨论】:

          【解决方案6】:

          声明开始和结束日期 DECLARE @SDATE AS DATETIME

          TART_DATE  AS DATETIME
          DECLARE @END_-- Set Start and End date
          SET @START_DATE = GETDATE()
          SET @END_DATE    = DATEADD(SECOND, 3910, GETDATE())
          

          -- 获取 HH:MI:SS:MMM(24H) 格式的结果 SELECT CONVERT(VARCHAR(12), DATEADD(MS, DATEDIFF(MS, @START_DATE, @END_DATE), 0), 114) AS TimeDiff

          【讨论】:

            【解决方案7】:

            将结果转换为TIME,结果将采用间隔持续时间的时间格式。

            select CAST(job_end - job_start) AS TIME(0)) from tableA
            

            【讨论】:

            • 太棒了,这正是我要找的。谢谢!
            【解决方案8】:

            我认为您需要 job_start 和 job_end 之间的时间间隔。

            试试这个...

            select SUBSTRING(CONVERT(VARCHAR(20),(job_end - job_start),120),12,8) from tableA
            

            我最终得到了这个。

            01:14:37
            

            【讨论】:

              【解决方案9】:

              如果您的数据库StartTime = 07:00:00 和 endtime = 14:00:00,并且两者都是时间类型。您获取时差的查询是:

              SELECT TIMEDIFF(Time(endtime ), Time(StartTime )) from tbl_name
              

              如果您的数据库 startDate = 2014-07-20 07:00:00 和 endtime = 2014-07-20 23:00:00,您也可以使用此查询。

              【讨论】:

              • 什么版本的SQL Server支持TIMEDIFF函数?
              【解决方案10】:

              在 Sql Server 中试试这个

              SELECT 
                    start_date as firstdate,end_date as seconddate
                     ,cast(datediff(MI,start_date,end_date)as decimal(10,3)) as minutediff
                    ,cast(cast(cast(datediff(MI,start_date,end_date)as decimal(10,3)) / (24*60) as int ) as varchar(10)) + ' ' + 'Days' + ' ' 
                    + cast(cast((cast(datediff(MI,start_date,end_date)as decimal(10,3)) / (24*60) - 
                      floor(cast(datediff(MI,start_date,end_date)as decimal(10,3)) / (24*60)) ) * 24 as int) as varchar(10)) + ':' 
              
                   + cast( cast(((cast(datediff(MI,start_date,end_date)as decimal(10,3)) / (24*60) 
                    - floor(cast(datediff(MI,start_date,end_date)as decimal(10,3)) / (24*60)))*24
                      -
                      cast(floor((cast(datediff(MI,start_date,end_date)as decimal(10,3)) / (24*60) 
                    - floor(cast(datediff(MI,start_date,end_date)as decimal(10,3)) / (24*60)))*24) as decimal)) * 60 as int) as varchar(10))
              
                  FROM [AdventureWorks2012].dbo.learndate
              

              【讨论】:

                【解决方案11】:

                您可以使用DATEDIFF 函数获取分钟、秒、天等的差异。

                SELECT DATEDIFF(MINUTE,job_start,job_end)
                

                MINUTE 显然返回以分钟为单位的差异,您还可以使用 DAY、HOUR、SECOND、YEAR(完整列表请参见在线图书链接)。

                如果你想变得花哨,你可以用不同的方式显示,例如 75 分钟可以这样显示:01:15:00:0

                这是为 SQL Server 2005 和 2008 执行此操作的代码

                -- SQL Server 2005
                SELECT CONVERT(VARCHAR(10),DATEADD(MINUTE,DATEDIFF(MINUTE,job_start,job_end),'2011-01-01 00:00:00.000'),114)
                
                -- SQL Server 2008
                SELECT CAST(DATEADD(MINUTE,DATEDIFF(MINUTE,job_start,job_end),'2011-01-01 00:00:00.000') AS TIME)
                

                【讨论】:

                • @JamesHill 谢谢詹姆斯,听起来你需要一个假期!所以我赞成你的回答。
                • @some_bloody_fool,(:谢谢。实际上你可能是对的!
                • 好的,如果您愿意,我现在添加了另一种显示方式。
                猜你喜欢
                • 1970-01-01
                • 2015-08-28
                • 1970-01-01
                • 2010-12-04
                • 1970-01-01
                • 2014-08-29
                • 2020-07-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多