sql - 如何在 OracleSQL 中减去 2 个时间戳(一个为日期,另一个为 HH24:MI 格式)并以 HH24:MI 格式获取结果
问题描述
我有一个包含两列的表,Start_time 和 SLA。
开始时间每天更新,并采用日期格式,例如 01-Jun-2021 19:15:38
SLA 列将 HH24MI 固定为 2010
我希望 1915 - 2010 为 -00:55(如 HH24MI 格式)
SELECT TO_CHAR((TO_CHAR(START_TIME,'HH24')||TO_CHAR(START_TIME,'MI'))-2010,'0000')
FROM DUAL;
上面将给出结果为 -0095 但我希望它是 -00:55
解决方案
将 存储start_time
为DATE
数据类型,将存储sla
为INTERVAL DAY TO SECOND
数据类型:
CREATE TABLE table_name (
start_time DATE,
sla INTERVAL DAY TO SECOND
);
那么您的数据将是:
INSERT INTO table_name ( start_time, sla ) VALUES (
TO_DATE('01-Jun-2021 19:15:38', 'DD-MON-YYYY HH24:MI:SS', 'NLS_DATE_LANGUAGE=American'),
INTERVAL '20:10:00' HOUR TO SECOND
);
而且,要找到差异,您可以使用:
SELECT start_time,
sla,
(start_time - TRUNC(start_time)) DAY TO SECOND - sla AS difference
FROM table_name
哪个输出:
开始时间 服务水平协议 不同之处 2021-06-01 19:15:38 +00 20:10:00.000000 -000000000 00:54:22.000000000
如果您希望输出为格式化字符串,而不是间隔,则:
SELECT start_time,
sla,
CASE WHEN difference < INTERVAL '0' HOUR THEN '-' END
|| TO_CHAR( ABS( EXTRACT( HOUR FROM difference ) ), 'FM00' )
|| TO_CHAR( ABS( EXTRACT( MINUTE FROM difference ) ), 'FM00' )
AS difference
FROM (
SELECT start_time,
sla,
(start_time - TRUNC(start_time)) DAY TO SECOND - sla AS difference
FROM table_name
)
哪个输出:
开始时间 服务水平协议 不同之处 2021-06-01 19:15:38 +00 20:10:00.000000 -0054
db<>在这里摆弄
推荐阅读
- regex - 在 NGINX 中,从 URI 中删除 .html 扩展名而不进行重定向
- html - 使引导表标题具有无限表高或大型数据集的粘性
- javascript - 如何在 CSS 中隐藏列表后面的内容?
- php - MySQL 中带有“SET”且没有主键但条目相同的两个表之间的多列更新
- angular - 如何为重复文件创建角度示意图?
- php - 删除在 Laravel Admin 上有关系的实体时如何添加例外?
- selenium - 是否可以从命令行向 Nightwatch 发送参数?
- javascript - 如何配置 babel 导入 css
- python - 将列表,值插入mysql表
- date - 使用 PostgreSQL (AWS Redshift) 将 Qlik Sense 日期选择器扩展的日期格式从“M/D/YYYY”更改为“DD/MM/YYYY”