我正在处理一个查询,该查询提取有关商店开仓和关闭时间的信息。这是结果集:
RTL_LOC_ID TRANS_TYPCODE BEGIN_DATETIME
---------- ------------------------------ ---------------------------
2390 WORKSTATION_OPEN 14.10.01 09:53:43,121000000
2390 WORKSTATION_CLOSE 14.10.01 23:51:49,729000000
2390 WORKSTATION_OPEN 14.10.02 09:57:47,768000000
2390 WORKSTATION_CLOSE 14.10.02 23:47:00,120000000
2390 WORKSTATION_OPEN 14.10.03 09:47:38,949000000
2390 WORKSTATION_CLOSE 14.10.03 23:45:42,602000000
选择了6行
这是查询:
SELECT RTL_LOC_ID,TRANS_TYPCODE, BEGIN_DATETIME
FROM TRN_TRANS
WHERE(trans_typcode = 'WORKSTATION_OPEN' OR trans_typcode='WORKSTATION_CLOSE')
AND BUSINESS_DATE BETWEEN '14.10.01 00:00:00' AND '14.10.03 00:00:00'
ORDER BY BUSINESS_DATE, BEGIN_DATETIME ASC;
因此,我需要计算商店开盘和关闭之间的小时数,并将该值放入新列中。我还想把当天的结果放在同一行,而不是每天两行。
由于
答案 0 :(得分:0)
这个答案假定 MySQL ,因为问题没有用Oracle开头标记。我在这里留下这个答案,因为它可能会激发具有Oracle技能的人找到解决方案......
假设某个位置在关闭之前总是打开,那么快速而肮脏的解决方案可能如下所示:
SELECT RTL_LOC_ID, DATE(BUSINESS_DATE),
MIN(BUSINESS_DATE) AS [OpenTime],
MAX(BUSINESS_DATE) AS [CloseTime]
FROM
TRN_TRANS
WHERE(trans_typcode = 'WORKSTATION_OPEN' OR trans_typcode='WORKSTATION_CLOSE')
AND BUSINESS_DATE BETWEEN '14.10.01 00:00:00' AND '14.10.03 00:00:00'
GROUP BY RTL_LOC_ID, DATE(BUSINESS_DATE)
ORDER BY DATE(BUSINESS_DATE)
或者如果你想变得迂腐:
SELECT RTL_LOC_ID, DATE(BUSINESS_DATE),
MAX(CASE trans_typcode WHEN 'WORKSTATION_OPEN' THEN BUSINESS_DATE ELSE NULL END) AS [OpenTime],
MAX(CASE trans_typcode WHEN 'WORKSTATION_CLOSE' THEN BUSINESS_DATE ELSE NULL END) AS [CloseTime],
FROM
-- rest of query same as above --
答案 1 :(得分:0)
这是你的意思吗?
SELECT
TRN_TRANS.RTL_LOC_ID,
DATE_FORMAT(BEGIN_DATETIME ,'%Y-%m-%d') AS _date,
TIMEDIFF(closing_time.BEGIN_DATETIME , opening_time.BEGIN_DATETIME ) AS _hours
FROM TRN_TRANS
INNER JOIN
(
SELECT RTL_LOC_ID, BEGIN_DATETIME, DATE_FORMAT(BEGIN_DATETIME ,'%Y-%m-%d') as _date
FROM TRN_TRANS
WHERE TRANS_TYPCODE = 'WORKSTATION_OPEN'
) AS opening_time
ON
TRN_TRANS.RTL_LOC_ID = opening_time.RTL_LOC_ID
AND
DATE_FORMAT(TRN_TRANS.BEGIN_DATETIME ,'%Y-%m-%d') = opening_time._date
INNER JOIN
(
SELECT RTL_LOC_ID, BEGIN_DATETIME, DATE_FORMAT(BEGIN_DATETIME ,'%Y-%m-%d') as _date
FROM TRN_TRANS
WHERE TRANS_TYPCODE = 'WORKSTATION_CLOSE'
) AS closing_time
ON
TRN_TRANS.RTL_LOC_ID = closing_time.RTL_LOC_ID
AND
DATE_FORMAT(TRN_TRANS.BEGIN_DATETIME ,'%Y-%m-%d') = closing_time._date
GROUP BY TRN_TRANS.RTL_LOC_ID, _date, _hours