【问题标题】:oracle concat timestmap from current_date来自 current_date 的 oracle concat 时间戳
【发布时间】:2018-03-23 11:07:17
【问题描述】:

我几乎不尝试连接时间戳。列时间,定义为 varchar2,包含像 23:15 这样的值。现在我想用今天的日期和那个时间创建一个时间戳,在这个例子中 23.03.18 23:15:00.00000 是预期的。我这样做的方式是

to_timestamp(to_char(trunc(current_date),'ddMMyyyy') ||
             to_char(time),'dd.MM.yyyy hh24:mi:ss')

它有效。但是当字段时间的值为 06:15 时,我收到消息“小时必须在 0 到 23 之间”。无论我尝试什么,当时间值前导零时,它总是这个消息。这怎么能纠正?

【问题讨论】:

  • 我投票决定将此问题作为离题结束,因为问题的解决方案(在 OP 的评论中给出)是对与所提出问题无关的 Java 代码的更改,因此此问题已解决以不太可能帮助未来读者的方式。

标签: oracle timestamp


【解决方案1】:

您不需要在当前日期使用TRUNC,因为TO_CHAR 将仅提取日常组件,您也不需要在time 列上使用TO_CHAR,因为它已经是一个字符串。除了这些简化之外,您的查询还有效:

SQL Fiddle

Oracle 11g R2 架构设置

CREATE TABLE times ( time ) AS
SELECT '00:00' FROM DUAL UNION ALL
SELECT '06:45' FROM DUAL UNION ALL
SELECT '12:00' FROM DUAL UNION ALL
SELECT '18:59' FROM DUAL UNION ALL
SELECT '23:15' FROM DUAL;

查询 1

SELECT time,
       TO_TIMESTAMP(
         TO_CHAR( CURRENT_DATE, 'YYYY-MM-DD' ) || time,
         'YYYY-MM-DDHH24:MI'
       ) AS current_day_time
FROM   times

Results

|  TIME |      CURRENT_DAY_TIME |
|-------|-----------------------|
| 00:00 | 2018-03-23 00:00:00.0 |
| 06:45 | 2018-03-23 06:45:00.0 |
| 12:00 | 2018-03-23 12:00:00.0 |
| 18:59 | 2018-03-23 18:59:00.0 |
| 23:15 | 2018-03-23 23:15:00.0 |

【讨论】:

    【解决方案2】:

    对我来说没问题:

    SQL> WITH test
      2       AS (SELECT '23:15' time FROM DUAL
      3           UNION
      4           SELECT '06:15' time FROM DUAL)
      5  SELECT TO_TIMESTAMP (
      6            TO_CHAR (CURRENT_DATE, 'ddMMyyyy') || time,
      7            'dd.MM.yyyy hh24:mi:ss') result
      8    FROM test;
    
    RESULT
    ----------------------------------------------------------------
    23.03.18 06:15:00,000000000
    23.03.18 23:15:00,000000000
    
    SQL>
    

    请发布您的 SQL*Plus 会话,以便我们可以看到您做了什么。

    【讨论】:

    • 我刚刚找到了原因。列 time 由 java 应用程序填充,其中前导零用 String.format("%02d"...) 添加。我改变了填充零的方式。这很奇怪,但它有效。又学到东西了。
    • 好吧,我很高兴你找到了罪魁祸首并成功了。
    • TO_CHAR (..., 'ddMMyyyy')TO_TIMESTAMP (..., 'dd.MM.yyyy hh24:mi:ss') 不匹配它似乎有效,但 TO_TIMESTAMP(TO_CHAR(TRUNC(CURRENT_DATE), 'ddMMyyyy') || TIME, 'ddMMyyyyhh24:mi') 会更好。当您使用 TO_CHAR(..., 'ddMMyyyy') 时,TRUNC(...) 也是多余的
    【解决方案3】:

    尝试其他方式:如果小时 插入前导 0

    to_timestamp(to_char(trunc(current_date),'ddMMyyyy') ||
                 to_char(
                           case when substr(time,1,instr(time,':',1,1)-1)<10 
                                   then'0'||time  
                                else time 
                           end),'dd.MM.yyyy hh24:mi:ss')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-14
      • 2019-08-15
      • 1970-01-01
      • 1970-01-01
      • 2011-01-07
      • 2018-04-17
      • 2011-07-12
      • 2021-06-02
      相关资源
      最近更新 更多