从时间中提取小时并添加转换为小时的分钟以及从时间中提取分钟并找到提醒(模数)

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,其中包含YEARWEEK 等数据。 我需要返回本周的TOTAL_SUM 和本周的 TOTAL_SUM。 例如,如果我有 10 个 weeklyReport 过去和本周。 我想知道本周和过去一周的当前状态。 当我在 Workbanch 中运行这个 MySQL 查询时,我得到类似这样的结果

TOTAL_SUM
459:30

459 呈现 hour30 呈现 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 并添加一些小时

将天、小时和分钟转换为 UTC - node.js

如何从充满 datetime.time 值的系列中提取小时、分钟和秒

将纪元时间转换为小时前,从 iPhone 中的当前日期开始分钟前

在 XSL 中将地理坐标从度-小时-分钟转换为十进制

excel如何把时间段转换为分钟或小时数