从时间中提取小时并添加转换为小时的分钟以及从时间中提取分钟并找到提醒(模数)
Posted
技术标签:
【中文标题】从时间中提取小时并添加转换为小时的分钟以及从时间中提取分钟并找到提醒(模数)【英文标题】:Extract hours from time and add minutes converted to hours as well as extract minutes from time and find reminder (modulo) 【发布时间】:2020-09-11 06:44:48 【问题描述】:我刚开始学习Oracle SQL
,但遇到了一个问题。
以下情况。我有mysql
数据库,我想将一些查询从MySQL
翻译成Oracle SQL
我有表weekly_report
,其中包含YEAR
、WEEK
等数据。
我需要返回本周的TOTAL_SUM
和本周的 TOTAL_SUM。
例如,如果我有 10 个 weeklyReport
过去和本周。
我想知道本周和过去一周的当前状态。
当我在 Workbanch 中运行这个 MySQL 查询时,我得到类似这样的结果
TOTAL_SUM
459:30
459
呈现 hour
和 30
呈现 minutes
这是 MySQL 查询
SELECT
CONCAT(
-- extract hours from time and add minutes converted to hours
(SUM(SUBSTRING_INDEX(A.Quantity, ':', 1)) + TRUNCATE((SUM(SUBSTRING_INDEX(A.Quantity, ':', -1)) / 60),0)),
':',
-- extract minutes from time and find reminder (modulo)
LPAD((SUM(SUBSTRING_INDEX(A.Quantity, ':', -1)) % 60), 2, 0)
)
AS
TOTAL_SUM FROM (
SELECT
ata.ATAID AS AtaId, ata.ProjectID, ata.StartDate, ataAW.Quantity
FROM
ata
INNER JOIN
weekly_report
ON
weekly_report.ataId = ata.ATAID
INNER JOIN
ata_articles AS ataAW
ON
ataAW.wrId = weekly_report.id
WHERE
ata.ATAID = $ataId
AND
ataAW.type = 1
AND
(weekly_report.status != 3 AND weekly_report.status != 4)
AND
(
weekly_report.year < (SELECT year FROM weekly_report WHERE id = $weeklyReportId)
OR
(
weekly_report.year <= (SELECT year FROM weekly_report WHERE id = $weeklyReportId)
AND
weekly_report.week <= (SELECT week FROM weekly_report WHERE id = $weeklyReportId)
)
)
) AS A group by A.AtaId
当我修改此查询并写入Oracle SQL
时,我会得到类似的结果
SELECT
CONCAT(
-- extract hours from time and add minutes converted to hours
(SUM(SUBSTR(A.Quantity, ':', 1)) + TRUNCATE((SUM(SUBSTR(A.Quantity, ':', -1)) / 60),0)),
':',
-- extract minutes from time and find reminder (modulo)
LPAD((SUM(SUBSTR(A.Quantity, ':', -1)) MOD 60), 2, 0)) TOTAL_SUM
FROM (
SELECT
ata.ATAID AS AtaId, ata.ProjectID, ata.StartDate, ataAW.Quantity
FROM
ata
INNER JOIN
weekly_report
ON
weekly_report.ataId = ata.ATAID
INNER JOIN
ata_articles ataAW
ON
ataAW.wrId = weekly_report.id
WHERE
ata.ATAID = 321
AND
ataAW.type = 1
AND
(weekly_report.status != 3 AND weekly_report.status != 4)
AND
(
weekly_report.year < (SELECT year FROM weekly_report WHERE id = 200)
OR
(
weekly_report.year <= (SELECT year FROM weekly_report WHERE id = 200)
AND
weekly_report.week <= (SELECT week FROM weekly_report WHERE id = 200)
)
)
) A
group by A.AtaId
目前weekly_report
表中的位置是:
YEAR WEEK
2020 12
2020 15
2020 12
这里的问题是我收到类似的错误消息
ORA-00907: missing right parenthesis
在这行代码中
LPAD((SUM(SUBSTR(A.Quantity, ':', -1)) MOD 60), 2, 0)) TOTAL_SUM
所以,我认为提取时间和时间的部分写得不正确。
CONCAT(
-- extract hours from time and add minutes converted to hours
(SUM(SUBSTR(A.Quantity, ':', 1)) + TRUNCATE((SUM(SUBSTR(A.Quantity, ':', -1)) / 60),0)),
':',
-- extract minutes from time and find reminder (modulo)
LPAD((SUM(SUBSTR(A.Quantity, ':', -1)) MOD 60), 2, 0)) TOTAL_SUM
谁能告诉我这里出了什么问题?如何修改它以运行查询成功?
【问题讨论】:
【参考方案1】:您似乎误用了MOD
函数。
应该是例如
SQL> select mod(5, 2) from dual;
MOD(5,2)
----------
1
而不是
SQL> select 5 mod 2 from dual;
select 5 mod 2 from dual
*
ERROR at line 1:
ORA-00923: FROM keyword not found where expected
SQL>
【讨论】:
我指的是你的这行代码:LPAD((SUM(SUBSTR(A.Quantity, ':', -1)) MOD 60), 2, 0)) TOTAL_SUM
,它以错误的方式使用了 MOD。
您的意思是使用 SELECT 或 ... 安装 LPAD?
MOD 被滥用,不是 LPAD,不是 SELECT,不是 ... MOD。
好的,我明白了。但是我怎么能 100% 确定 MOD 是错误的呢?
好的,那这部分代码怎么写LPAD((SUM(SUBSTR(A.Quantity, ':', -1)) MOD 60), 2, 0)) TOTAL_SUM
以上是关于从时间中提取小时并添加转换为小时的分钟以及从时间中提取分钟并找到提醒(模数)的主要内容,如果未能解决你的问题,请参考以下文章
将(日期+时间)从 NSString 转换为 NSDate 并添加一些小时
如何从充满 datetime.time 值的系列中提取小时、分钟和秒