Excel ORA-01861:尽管使用了to_date函数,但文字与格式字符串不匹配

Excel ORA-01861:尽管使用了to_date函数,但文字与格式字符串不匹配,excel,vba,oracle,oracle11g,Excel,Vba,Oracle,Oracle11g,在EXCEL VBA模块上遇到此错误。在Oracle11g界面上运行良好 select "schema_name", "table_name", "bundle_name", "text_file", "sequence_no", lastupdateapplied, "next_sat_date","prev_sat_date", TO_DATE(SYSDATE,'DD-MM-YYYY'), CASE

在EXCEL VBA模块上遇到此错误。在Oracle11g界面上运行良好

select 
        "schema_name", "table_name", "bundle_name", "text_file", "sequence_no", 
                    lastupdateapplied, "next_sat_date","prev_sat_date", TO_DATE(SYSDATE,'DD-MM-YYYY'),
        CASE 
                WHEN ("schema_name"='EDM_V1' OR "schema_name"='FF_V3' OR "schema_name"='SYM_V1') and 
                            ("next_sat_date"-lastupdateapplied<=0 OR 
                            lastupdateapplied-"prev_sat_date">=0) 
                then 'EVERYTHING LOOKS OK HERE.'
                WHEN  ("schema_name"='FP_V2' OR "schema_name"='FE_V4' OR "schema_name"='REF_V2') and 
                            (lastupdateapplied - TO_DATE(SYSDATE,'DD-MM-YYYY') =0)
                then 'EVERYTHING LOOKS OK HERE.'
                Else 'PLEASE CHECK THE SCHEDULER FOR THIS FEED.' END as    "VERIFICATION_NOTE"
from
        ( 
            select 
                    UPPER(ds."schema_name") as "schema_name", UPPER(ds."table_name") as "table_name", ds."bundle" as "bundle_name", ds."text_file" as "text_file", 
                    ds."sequence" as "sequence_no", TO_DATE(s2.end_time,'DD-MM-YYYY') as lastupdateapplied, TO_DATE(next_day(SYSDATE,'SATURDAY'),'DD-MM-YYYY') as "next_sat_date",  
                    TO_DATE(next_day(SYSDATE,'SATURDAY')-(INTERVAL '7' DAY + INTERVAL '1' SECOND),'DD-MM-YYYY') AS "prev_sat_date"
            from FDS_FDS_DATA_SEQUENCES ds 
            Join 
            (   select "table_name", "bundle", "text_file", max("end_time") as end_time 
                from FDS_FDS_FILE_HISTORY 
                where "file_type" = 'full' 
                group by "table_name", "bundle", "text_file") s 
             on s."bundle" = ds."bundle" and s."table_name" = ds."table_name" and s."text_file" = ds."text_file"
            Join 
            (   select "table_name", "bundle", "text_file", max("end_time") as end_time 
                from FDS_FDS_FILE_HISTORY 
                where "file_type" = 'update' 
                group by "table_name", "bundle", "text_file") s2 
            on s2."bundle" = ds."bundle" and s2."table_name" =  ds."table_name" and s2."text_file" = ds."text_file" 
Order by 
            ds."schema_name" asc, ds."bundle" asc, s2.end_time desc )
预期结果是我不应该得到错误,实际结果是==>当我在ORACLE SQL Developer中运行相同的查询时,它运行得很好,但在excel VBA模块中没有运行

尽管使用了tou_date函数

实际上,这是因为使用了to_date函数。你有这样的事情:

TO_DATE(SYSDATE,'DD-MM-YYYY')
TO_DATE(s2.end_time,'DD-MM-YYYY')
TO_DATE(next_day(SYSDATE,'SATURDAY'),'DD-MM-YYYY')
TO_DATE(next_day(SYSDATE,'SATURDAY')-(INTERVAL '7' DAY + INTERVAL '1' SECOND),'DD-MM-YYYY')
第二个可能还可以,但前提是sd.end_time存储为字符串,而这几乎肯定不应该

对于其他三个,至少,您正在将已经是日期的内容传递到一个函数中,该函数用于将字符串转换为日期。所以你真的在做,例如:

TO_DATE(TO_CHAR(SYSDATE),'DD-MM-YYYY')
而且,由于该隐式TO_CHAR没有格式模型,它将使用会话的NLS设置,特别是NLS_DATE_格式。您看到它在一个环境中工作,因为那里的设置实际上意味着它在做:

TO_DATE(TO_CHAR(SYSDATE, 'DD-MM-YYYY'),'DD-MM-YYYY')
而在另一个会议上,它可能有效地做到:

TO_DATE(TO_CHAR(SYSDATE, 'DD-MON-RR'),'DD-MM-YYYY')
。。。这将失去世纪,将日期值保留在0019年而不是2019年;或

TO_DATE(TO_CHAR(SYSDATE, 'YYYY-MM-DD'),'DD-MM-YYYY')
它抛出ORA-01861:literal与您看到的格式字符串不匹配

虽然您可以尝试强制每个客户端和应用程序上的NLS设置与您正在执行的操作相匹配,但最终会出错,您应该进行转换。只需使用SYSDATE和其他直接计算的数据即可;或者,如果您试图获取时间设置为午夜的日期,请将其截断:

trunc(SYSDATE)
trunc(s2.end_time)
trunc(next_day(SYSDATE,'SATURDAY'))
trunc(next_day(SYSDATE,'SATURDAY')-(INTERVAL '7' DAY + INTERVAL '1' SECOND))

另请注意,next_day的第二个参数是当前会话日期语言中的日期名称或缩写,因此从其他语言的会话运行此参数的人也会看到错误,如ORA-01846:不是一周中的有效日期。

您似乎只是将Jira票证复制到堆栈溢出中。不过,我们不是来帮你做工作的,如果你有具体问题,我们是来帮你的。大卫,谢谢你的评论。我在论坛上看到了其他问题,但在不同的情况下,我遇到了错误。这是我发布问题的唯一原因。希望一切顺利。亚历克斯·普尔非常感谢你解决了我的问题。这也会帮助其他人。