相对较新的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”
1条答案
按热度按时间hsgswve41#
您的
ZE_VIEW.MRTU_SLD_FCST_RTM_V.OPR_DATE
列似乎是DATE
数据类型。Never在
DATE
上使用TO_DATE
,因为TO_DATE
需要一个字符串作为第一个参数,所以Oracle会隐式地将DATE
转换为字符串,然后将其传递给函数以转换回DATE
;在最好的情况下,这是毫无意义的,在最坏的情况下,Oracle将在隐式字符串转换中使用不同的格式,并且您的日期将被损坏(这就是您正在发生的事情,因为日期被隐式转换为具有两位数年份的字符串,然后转换回预期的四位数年份)。