Oracle中将VARCHAR2类型的数字42499转换为时间字段报错求助
Hi there! Let's work through this time conversion problem step by step.
First, let's unpack why you're getting that ORA-01850 error. Your current code tries to parse 42499 with the format mask 'hh24ss', which tells Oracle to treat the first two characters as hours (42) and the last two as seconds (99). Since valid hours range from 0 to 23, Oracle throws an error immediately—plus, 99 seconds is also invalid (seconds can only be 0-59), but the hour issue is the first one it catches.
Also, quick note: your original approach of to_number(to_date(...)) doesn't do what you want. TO_DATE returns a date object, and TO_NUMBER would convert that to Oracle's internal numeric representation of dates (which counts days since a fixed point), not the time value you're after.
Now, the key question is: what does 42499 actually represent? Based on the value, here are the two most likely scenarios and their fixes:
Scenario 1: 42499 is total seconds since midnight
If this number counts how many seconds have passed since midnight, you can convert it to an interval and add it to a midnight timestamp to get a valid time:
SELECT TO_TIMESTAMP('00:00:00', 'HH24:MI:SS') + NUMTODSINTERVAL(TO_NUMBER(transactiontime), 'SECOND') AS converted_transaction_time FROM your_table;
For 42499, this would give you 11:48:19 (since 42499 seconds = 11 hours + 48 minutes + 19 seconds).
Scenario 2: 42499 is a truncated HHMMSS format (missing leading zero)
If the value is supposed to be a 6-digit HHMMSS time (like 042459 for 04:24:59) but lost its leading zero, you can pad it to 6 digits first, then convert:
SELECT TO_DATE(LPAD(transactiontime, 6, '0'), 'HH24MISS') AS converted_transaction_time FROM your_table;
Important: This only works if the padded value is a valid time. For example, 42499 would become 042499—but 99 seconds is still invalid, so you'd need to fix the underlying data (maybe it's a typo for 59) or handle invalid values with VALIDATE_CONVERSION if your Oracle version supports it:
SELECT CASE WHEN VALIDATE_CONVERSION(LPAD(transactiontime, 6, '0') AS DATE, 'HH24MISS') = 1 THEN TO_DATE(LPAD(transactiontime, 6, '0'), 'HH24MISS') ELSE NULL -- or handle invalid values as needed END AS converted_transaction_time FROM your_table;
If you can share more context about what this transaction time is supposed to represent (e.g., is it elapsed time since an event, or a specific time of day?), I can help narrow down the exact solution!
备注:内容来源于stack exchange,提问作者Tatenda Mafura

