为什么在Oracle SQL日期格式设置中,年份的格式设置不正确,前导为零?

dohp0rv5  于 2023-06-05  发布在  Oracle
关注(0)|答案(1)|浏览(239)

相对较新的SQL。我尝试合并几个日期列-一个用于完整日期(OPR_DATE),一个用于日期的小时(HOUR_ENDING),一个用于该日期的分钟(OPR_5MIN),并创建一个具有完整正确日期/小时/分钟(VALID_DATE)的新列。
我能够正确地添加月、日、小时和分钟,但是年的千位数读取为0而不是2。例如:OPR_DATE中的2022被格式化为VALID_DATE中的0022。
例如,对于以下代码,其中OPR_DATE为2/24/2022 12:00:00 AM,HOUR_ENDING为1.00000,OPR_5MIN为5.0000,VALID_DATE的格式为2/24/0022 01:05:00 AM。
OPR_DATE是日期时间,HOUR_ENDING和OPR_5MIN是固定精度数字。

SELECT to_char(to_date(r.OPR_DATE, 'fmmm/fmdd/yyyy HH:MI:SS PM') + r.HOUR_ENDING/24 + r.OPR_5min/(24*60), 'fmmm/fmdd/yyyy HH:MI:SS PM') AS VALID_DATE,  
r.OPR_DATE, r.HOUR_ENDING, r.OPR_5MIN, r.DATA_ITEM, r.RESOURCE_NAME, r.VALUE AS REAL_TIME_VALUE, d.VALUE as DAY_AHEAD_VALUE 
FROM ZE_VIEW.MRTU_SLD_FCST_RTM_V  r
JOIN ZE_VIEW.MRTU_SLD_FCST_DAM_V d
ON d.OPR_DATE = r.OPR_DATE AND d.HOUR_ENDING = r.HOUR_ENDING

此外,请注意,在上面的代码中,我需要将VALID_DATE转换为fmmm/fmdd/yyyy以使代码工作,而OPR_DATE的格式为fmdd/fmmm/yyyy。如果我将VALID_DATE转换为日期格式,如OPR_DATE本身的格式(fmmm/fmdd/yyyy),我会得到以下错误:
“Oracle数据库错误1858:ORA-01858:在需要数字的地方找到非数字字符
错误代码:3834 A5 EA”

hsgswve4

hsgswve41#

您的ZE_VIEW.MRTU_SLD_FCST_RTM_V.OPR_DATE列似乎是DATE数据类型。

NeverDATE上使用TO_DATE,因为TO_DATE需要一个字符串作为第一个参数,所以Oracle会隐式地将DATE转换为字符串,然后将其传递给函数以转换回DATE;在最好的情况下,这是毫无意义的,在最坏的情况下,Oracle将在隐式字符串转换中使用不同的格式,并且您的日期将被损坏(这就是您正在发生的事情,因为日期被隐式转换为具有两位数年份的字符串,然后转换回预期的四位数年份)。

SELECT to_char(
         r.OPR_DATE + r.HOUR_ENDING/24 + r.OPR_5min/(24*60),
         'mm/dd/yyyy HH:MI:SS PM'
       ) AS VALID_DATE,  
       r.OPR_DATE,
       r.HOUR_ENDING,
       r.OPR_5MIN,
       r.DATA_ITEM,
       r.RESOURCE_NAME,
       r.VALUE AS REAL_TIME_VALUE,
       d.VALUE as DAY_AHEAD_VALUE 
FROM   ZE_VIEW.MRTU_SLD_FCST_RTM_V  r
       JOIN ZE_VIEW.MRTU_SLD_FCST_DAM_V d
       ON     d.OPR_DATE = r.OPR_DATE
          AND d.HOUR_ENDING = r.HOUR_ENDING

相关问题