oracle SQL错误[1821] [220008]:ORA-01821:无法识别日期格式

9ceoxa92  于 2023-08-04  发布在  Oracle
关注(0)|答案(1)|浏览(112)

我想从时间戳访问past-midnight time并将其转换为秒,然后将它们加在一起以获得秒AS seconds的完整值。
我在试着-

SELECT 
    TO_NUMBER(TO_CHAR(a.date_column, 'hhhhh')) * 3600 +
    TO_NUMBER(TO_CHAR(a.date_column, 'mmmmm')) * 60 +
    TO_NUMBER(TO_CHAR(a.date_column, 'sssss')) AS seconds
FROM 
    DUAL

字符串
但我得到了标题中提到的错误。
说明-a.date_columnvarchar,通过-

TO_TIMESTAMP(TO_CHAR(a.dte, 'YYYY/MM/DD') || ' ' || a.time, 'YYYY/MM/DD HH24:MI:SS:FF3') AS date_column


看起来像是

date_column
2018-04-02 04:24:22:000
2018-04-03 03:44:34:000
2018-04-04 02:19:45:000
2018-04-04 04:33:34:000


我希望得到以秒为单位的总值。例如-12876

wztqucjr

wztqucjr1#

使用EXTRACT

SELECT date_column,
       EXTRACT(HOUR FROM date_column) * 3600
       + EXTRACT(MINUTE FROM date_column) * 60
       + EXTRACT(SECOND FROM date_column) AS seconds
FROM   table_name

字符串
其中,对于样本数据:

CREATE TABLE table_name (date_column) AS
SELECT TIMESTAMP '1970-01-01 00:00:00.000' FROM DUAL UNION ALL
SELECT TIMESTAMP '1970-01-01 00:00:01.000' FROM DUAL UNION ALL
SELECT TIMESTAMP '1970-01-01 00:01:00.000' FROM DUAL UNION ALL
SELECT TIMESTAMP '1970-01-01 01:00:00.000' FROM DUAL UNION ALL
SELECT TIMESTAMP '1970-01-01 23:59:59.999' FROM DUAL;


输出午夜后的秒数:
| 秒| SECONDS |
| --| ------------ |
| 0个| 0 |
| 一个| 1 |
| 六十| 60 |
| 三千六百| 3600 |
| 86399.999| 86399.999 |
对于您的示例数据:

CREATE TABLE table_name (date_column) AS
SELECT TIMESTAMP '2018-04-02 04:24:22.000' FROM DUAL UNION ALL
SELECT TIMESTAMP '2018-04-03 03:44:34.000' FROM DUAL UNION ALL
SELECT TIMESTAMP '2018-04-04 02:19:45.000' FROM DUAL UNION ALL
SELECT TIMESTAMP '2018-04-04 04:33:34.000' FROM DUAL;


输出午夜后的秒数:
| 秒| SECONDS |
| --| ------------ |
| 15862| 15862 |
| 一三四七四| 13474 |
| 八三八五| 8385 |
| 一六四一四| 16414 |
如果你想计算所有这些值的总和,那么使用SUM

SELECT SUM(
         EXTRACT(HOUR FROM date_column) * 3600
         + EXTRACT(MINUTE FROM date_column) * 60
         + EXTRACT(SECOND FROM date_column)
       ) AS seconds
FROM   table_name


哪些输出:
| SECONDS |
| ------------ |
| 54135 |
(And如果你想得到一天以上的总数,并且你想把它限制在午夜后的时间,那么使用MOD(total, 86400)
如果需要不同的方法,则可以将TO_CHARHH24MISS.FF模型或SSSSS.FF模型一起使用(如果使用的是DATE数据类型,而不是TIMESTAMP s,则不需要FFDATE数据类型具有时间分量但没有小数秒,其也具有时间分量,但是可以具有小数秒)。
举例来说:

SELECT date_column,
       EXTRACT(HOUR FROM date_column) * 3600
       + EXTRACT(MINUTE FROM date_column) * 60
       + EXTRACT(SECOND FROM date_column) AS seconds,
       TO_CHAR(date_column, 'HH24') * 3600
       + TO_CHAR(date_column, 'MI') * 60
       + TO_CHAR(date_column, 'SS.FF') AS seconds2,
       TO_CHAR(date_column, 'SSSSS.FF') AS seconds3
FROM   table_name


输出:
| 秒|秒数2|秒数3| SECONDS3 |
| --|--|--| ------------ |
| 15862| 15862| 15862.000000000| 15862.000000000 |
| 一三四七四|一三四七四|13474.000000000| 13474.000000000 |
| 八三八五|八三八五|08385.000000000| 08385.000000000 |
| 一六四一四|一六四一四|16414.000000000| 16414.000000000 |
fiddle

相关问题