不同行中两个日期之间的SQL持续时间

不同行中两个日期之间的SQL持续时间,sql,tsql,sql-server-2000,Sql,Tsql,Sql Server 2000,如果有人能帮我构造一个MSSQL Server 2000查询,返回客户的a条目和B条目之间的持续时间,我将非常感谢您的帮助 并非所有客户都希望有B记录,因此不会返回结果 客户审计 +---+---------------+---+----------------------+ |彼得·格里芬2013-01-01 15:00:00| |马丁·比格斯2013-01-02 15:00:00| |彼得·格里芬2013-01-05 09:00:00| |超级马里奥2013-01-01 15:00:00|

如果有人能帮我构造一个MSSQL Server 2000查询,返回客户的a条目和B条目之间的持续时间,我将非常感谢您的帮助

并非所有客户都希望有B记录,因此不会返回结果

客户审计

+---+---------------+---+----------------------+ |彼得·格里芬2013-01-01 15:00:00| |马丁·比格斯2013-01-02 15:00:00| |彼得·格里芬2013-01-05 09:00:00| |超级马里奥2013-01-01 15:00:00| |马丁·比格斯2013-01-03 18:00:00| +---+---------------+---+----------------------+ 我希望得到类似的结果:

+--------------+----------------+ | Martin Biggs | 1 day, 3 hours | +--------------+----------------+ +--------------+----------------+ |Martin Biggs | 1天3小时| +--------------+----------------+ 类似下面的内容(不知道您的模式,因此需要更改对象的名称)就足够了

SELECT ABS(DATEDIFF(HOUR, CA.TheDate, CB.TheDate)) AS HoursBetween
FROM dbo.Customers CA
INNER JOIN dbo.Customers CB
ON CB.Name = CA.Name
AND CB.Code = 'B'
WHERE CA.Code = 'A'

这是Oracle查询,但据我所知,MS Server中的所有功能都可用。我确信我不必告诉您如何连接输出以获得所需的结果。输出中的所有值将在单独的列中-天、小时等。。。在这里格式化输出并不总是那么容易:

SELECT id, name, grade
     , NVL(EXTRACT(DAY    FROM day_time_diff), 0) days
     , NVL(EXTRACT(HOUR   FROM day_time_diff), 0) hours
     , NVL(EXTRACT(MINUTE FROM day_time_diff), 0) minutes
     , NVL(EXTRACT(SECOND FROM day_time_diff), 0) seconds
  FROM
  (
   SELECT id, name, grade
       , (begin_date-end_date) day_time_diff
     FROM
     (
      SELECT id, name, grade
           , CAST(start_date AS TIMESTAMP)  begin_date
           , CAST(end_date AS TIMESTAMP)    end_date
        FROM
         (
          SELECT id, name, grade, start_date
               , LAG(start_date, 1, to_date(null)) OVER (ORDER BY id)  end_date 
            FROM stack_test
         )
     )
   )
   /

Output:

ID  NAME           GRADE    DAYS    HOURS   MINUTES SECONDS
------------------------------------------------------------
 1  Peter Griffin   A       0        0      0       0
 2  Martin Biggs    A       1        1      0       0
 3  Peter Griffin   C       2        17     0       0
 4  Super Mario     A      -3       -18     0       0
 5  Martin Biggs    A       2        3      0       0
我使用的表结构/列-如果您提前处理好这些和数据,那就太好了:

CREATE TABLE stack_test
 (
  id        NUMBER
 ,name      VARCHAR2(50) 
 ,grade     VARCHAR2(3)
 ,start_date DATE
)
/

我们如何确定日期将大于另一个日期?否则,
DATEDIFF
可能会导致小时数为负:)@bonCodigo-是的,我们无法从规范和单个示例中推断出这一点,如果日期可能是“另一种方式”,则可以通过
ABS(…)
(现在添加到答案中)。这对我来说是足够的信息,可以使用-而且我已经学会了ABS函数:):)我指的是
ABS()
,也许这会让
SELECT id, name, grade
     , NVL(EXTRACT(DAY    FROM day_time_diff), 0) days
     , NVL(EXTRACT(HOUR   FROM day_time_diff), 0) hours
     , NVL(EXTRACT(MINUTE FROM day_time_diff), 0) minutes
     , NVL(EXTRACT(SECOND FROM day_time_diff), 0) seconds
  FROM
  (
   SELECT id, name, grade
       , (begin_date-end_date) day_time_diff
     FROM
     (
      SELECT id, name, grade
           , CAST(start_date AS TIMESTAMP)  begin_date
           , CAST(end_date AS TIMESTAMP)    end_date
        FROM
         (
          SELECT id, name, grade, start_date
               , LAG(start_date, 1, to_date(null)) OVER (ORDER BY id)  end_date 
            FROM stack_test
         )
     )
   )
   /

Output:

ID  NAME           GRADE    DAYS    HOURS   MINUTES SECONDS
------------------------------------------------------------
 1  Peter Griffin   A       0        0      0       0
 2  Martin Biggs    A       1        1      0       0
 3  Peter Griffin   C       2        17     0       0
 4  Super Mario     A      -3       -18     0       0
 5  Martin Biggs    A       2        3      0       0
CREATE TABLE stack_test
 (
  id        NUMBER
 ,name      VARCHAR2(50) 
 ,grade     VARCHAR2(3)
 ,start_date DATE
)
/