3

如果有人可以帮助我构建一个 MSSQL Server 2000 查询,该查询将返回客户的 A 条目和他们的 B 条目之间的持续时间,我将非常感谢一些帮助。

并非所有客户都有 B 记录,因此不会返回任何结果。

客户审核

+---+---------------+---+----------+
| 1 | 彼得格里芬 | 一个 | 2013-01-01 15:00:00 |
| 2 | 马丁比格斯 | 一个 | 2013-01-02 15:00:00 |
| 3 | 彼得格里芬 | C | 2013-01-05 09:00:00 |
| 4 | 超级马里奥 | 一个 | 2013-01-01 15:00:00 |
| 5 | 马丁比格斯 | 乙| 2013-01-03 18:00:00 |
+---+---------------+---+----------+

我希望结果类似于:

+--------------+----------------+
| 马丁比格斯 | 1 天 3 小时 |
+--------------+----------------+
4

3 回答 3

4

像下面这样的东西(不知道你的模式,所以你需要更改对象的名称)就足够了。

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'
于 2013-01-18T12:44:06.207 回答
1
SELECT A.CUSTOMER, DATEDIFF(HOUR, A.ENTRY_DATE, B.ENTRY_DATE) DURATION
FROM CUSTOMERSAUDIT A, CUSTOMERSAUDIT B
WHERE B.CUSTOMER = A.CUSTOMER AND B.ENTRY_DATE > A.ENTRY_DATE
于 2013-01-18T12:47:28.457 回答
0

这是 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
)
/
于 2013-01-18T14:27:21.160 回答