我如何使用 LPAD 修复 Oracle 中的 ORA-01850 小时必须介于 0 和 23 之间的问题

How I can fix ORA-01850 hour must be between 0 and 23 problem in Oracle using LPAD

我有以下 Select 声明:

SELECT 
pharmacy_employee_details.id,
pharmacy_employee_master.employee_number,
to_char(to_date(pharmacy_employee_master.entry_date,'j'),'dd/MM/yyyy') as ENTRY_DATE,
to_char(to_date (pharmacy_employee_master.entry_time, 'hh24miss'), 'hh:mi:ss') as ENTRY_TIME,
pharmacy_employee_master.beneficiaries,
pharmacy_employee_master.note,
PHARMACY_EMPLOYEE_DETAILS.ITEM_CODE,
PHARMACY_EMPLOYEE_DETAILS.ITEM_NAME,
PHARMACY_EMPLOYEE_DETAILS.QTY,
PHARMACY_EMPLOYEE_DETAILS.PRICE 
FROM PHARMACY_EMPLOYEE_MASTER 
INNER JOIN pharmacy_employee_details ON 
pharmacy_employee_details.pid=pharmacy_employee_master.id 
where 1=1 

当输入时间小于 10 时出现问题。我如何在 oracle 中使用左填充 (LPAD) 来解决这个问题?

如果 entry_time 的长度不是 6,您可以简单地使用 LPAD 填充 0,如下所示:

to_char(to_date (LPAD(pharmacy_employee_master.entry_time,6,0), 'hh24miss'), 'hh:mi:ss')

干杯!!

您最大的问题是您将日期和时间存储为字符串(或数字)而不是日期。您应该在 table 中解决此问题(如果可以的话)。

ALTER TABLE pharmacy_employee_master ADD ( entry_datetime DATE );

UPDATE pharmacy_employee_master
SET entry_datetime = TO_DATE( entry_date, 'J' )
                     + ( TO_DATE( LPAD( entry_time, 6, '0' ), 'hh24miss' )
                       - TO_DATE( '00:00:00', 'hh24:mi:ss' ) );

(然后删除 entry_dateentry_time 列,您无需担心丢失前导零,只需按照您的格式设置日期和时间要求。)

db<>fiddle

如果您不能这样做,请使用:

TO_CHAR(
  TO_DATE( LPAD( entry_time, 6, '0' ), 'hh24miss' ),
  'hh24:mi:ss'
)

(注意:您还需要 hh24 而不是 hh 这只是一个 12 小时制;或者,如果您确实想要 12 小时制,那么您可能还想要一个经络指示器'hh12:mi:ss am')