【问题标题】:How to find the difference between two dates in same column?如何找到同一列中两个日期之间的差异?
【发布时间】:2013-03-24 17:15:10
【问题描述】:

我有一个 SO_STATUS 表,它为服务订单的每个状态更改写入一条记录(我们将 Service_Order_ID 称为“Job_ID”)。 Job_ID 引用 SERVICE_ORDER 表。初始化服务订单时,会为显示日期时间的“打开”状态类型 (StatusType 2) 写入一条记录。然后在状态表中写入另一条记录,用于“进行中”(StatusType 1)。并且当服务订单“关闭”时,状态表中写入另一条记录(StatusType 3)。还有其他可能发生的状态类型,但这些是最常见的。 SO_STATUS 表中的数据如下所示:

id            Date                Job_ID  StatusTypeID  EmployeeID
1     2012-01-01 09:05:00.000       51        2             5
2     2012-01-01 10:00:00.000       52        2            12
3     2012-01-01 10:01:00.000       51        1             5
4     2012-01-01 12:15:00.000       53        2             8
5     2012-01-01 12:16:00.000       51        3             5
6     2012-01-01 13:00:00.000       52        1            12
7     2012-01-01 14:00:00.000       52        3            12
8     2012-01-01 14:15:00.000       53        1             8
9     2012-01-01 15:00:00.000       54        2            11
10    2012-01-01 16:30:00.000       53        3             8
11    2012-01-01 15:00:00.000       54        1            11
12    2012-01-01 16:30:00.000       54        3            11

我需要能够找到每个 Job_ID 的每次状态更改之间经过的时间。从本质上讲,工作从打开到关闭所花费的时间。

输出看起来像(EmployeeName 将从 EMPLOYEE 表中引用):

Job_ID       Duration    EmployeeName
  51         03:11:00        Kyle
  52         04:00:00        Chris
  53         04:15:00        Fred
  54         01:30:00        John

我将如何获得这种类型的输出?谢谢。

【问题讨论】:

    标签: sql sql-server sql-server-2008 datediff sliding-window


    【解决方案1】:

    你为什么不使用:

    SELECT DATEDIFF (anyparticularunit, ' 2012-01-01 09:05:00.000', ' 2012-01-01 15:00:00.000')
    

    通过以下链接查看 datediff:

    http://msdn.microsoft.com/en-us/library/ms189794.aspx

    也可以点击这个链接来获得不同的例子:

    http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=56126

    希望你能进一步提出条件。

    【讨论】:

      【解决方案2】:

      您可以使用 DATEDIFF 返回指定日期部分边界在指定开始日期和结束日期之间交叉的计数(有符号整数)(请参阅http://msdn.microsoft.com/en-us/library/ms189794.aspx

       SELECT Job_ID,
       DATEDIFF(day, (SELECT MIN(Date) FROM YOUTABLE WHERE Job_ID=k.Job_ID),(SELECT MAX(Date) FROM YOUTABLE WHERE Job_ID=k.Job_ID)),
       (SELECT EmployeeName FROM EmployeeTABLE WHERE EmployeeID=k.EmployeeID)) FROM YOUTABLE k
      

      【讨论】:

        【解决方案3】:

        如果你的数据库是Oracle,你可以这样做

        SELECT DISTINCT JOB_ID, MAX(DATE) OVER(PARTITION BY JOB_ID)-MIN(DATE) OVER(PARTITION BY JOB_ID) AS Duration FROM TA JOIN TB .....
        

        【讨论】:

          【解决方案4】:

          我创建了一些自定义代码来创建 dat 和时差,使用 datediff 函数并除以某些数字来生成小时、分钟和秒:

          SELECT 
              Job_ID,
              CAST(DATEDIFF(second, MIN(Date), MAX(Date)) / 3600 AS VARCHAR)
              + ':' + CAST((DATEDIFF(second, MIN(Date), MAX(Date)) % 3600) / 60 AS VARCHAR)
              + ':' + CAST(((DATEDIFF(second, MIN(Date), MAX(Date)) % 3600) % 60)  AS VARCHAR)
          FROM YOUTABLE 
          GROUP BY Job_ID
          

          【讨论】:

            【解决方案5】:

            试试下面给出的查询:

            Select t1.Job_ID,
            Convert(varchar(5),DateDiff(HH,Min(t1.JobDate),tbl.MaxDate))+' : '+convert(varchar(5),DateDiff(s,Min(t1.JobDate),tbl.MaxDate) % 3600/60)+' : '+Convert(varchar(5),DateDiff(s,Min(t1.JobDate),
            tbl.MaxDate) % 60) MinDate,t1.EmployeeName From SO_STATUS t1
            Inner join (Select Max(JobDate) MaxDate, job_id From SO_STATUS  Group By Job_Id)tbl on t1.Job_ID=tbl.Job_ID
            Inner Join EMPLOYEE e On e.EmployeeID=t1.EmployeeID
            Group By t1.EmployeeName,tbl.MaxDate,t1.Job_ID
            Order By t1.Job_ID
            

            【讨论】:

              【解决方案6】:

              这个这个-

              SET NOCOUNT ON;
              
              DECLARE @duration TABLE 
              (
                    id BIGINT IDENTITY
                  , [date] DATETIME
                  , job_id INT
                  , [status] VARCHAR(10)
                  , employee_id INT
              )
              
              INSERT INTO @duration ([date], job_id, [status], employee_id)
              VALUES
                  ('2012-01-01 09:05:00.000', 51, 'open', 5),
                  ('2012-01-01 10:00:00.000', 52, 'open', 12),
                  ('2012-01-01 10:01:00.000', 51, 'inprogress', 5),
                  ('2012-01-01 12:15:00.000', 53, 'open', 8),
                  ('2012-01-01 12:16:00.000', 51, 'closed', 5),
                  ('2012-01-01 13:00:00.000', 52, 'inprogress', 12),
                  ('2012-01-01 14:00:00.000', 52, 'closed', 12),
                  ('2012-01-01 14:15:00.000', 53, 'inprogress', 8),
                  ('2012-01-01 15:00:00.000', 54, 'open', 11),
                  ('2012-01-01 16:30:00.000', 53, 'closed', 8),
                  ('2012-01-01 15:00:00.000', 54, 'inprogress', 11),
                  ('2012-01-01 16:30:00.000', 54, 'closed', 11)
              
              SELECT 
                    job_id
                  , employee_id
                  , work_time = CONVERT(VARCHAR(12), MAX([date]) - MIN([date]), 114) 
              FROM @duration
              GROUP BY job_id, employee_id
              

              【讨论】:

                【解决方案7】:

                具有日期时间格式的不同表格的两个日期之间的差异。

                选择 t1.Column_Names,

                CONVERT(varchar(10),t1.CreatedOn,103)

                AS CreatedOn FROM table1 t1 INNER JOIN table2 t2

                开启 t1.id = t2.id WHERE CAST(t1.CreatedOn 作为日期)

                在@fromdate 和@todate 之间。

                我已将 t1.CreatedOn 作为保存日期的表属性。

                @fromdate 和 @todate 传递日期。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-04-03
                  • 2011-06-24
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多