【问题标题】:Strange TO_DATE and SQLPLUS behavior奇怪的 TO_DATE 和 SQLPLUS 行为
【发布时间】:2016-02-04 19:41:23
【问题描述】:

我有一个查询,它提供 SYSDATE 和来自配置文件的硬编码时间值。

select request_rrn||','||transfer_id||','||
client_id||','||src_fund_acct_id||','||
tgt_fund_acct_id||','||
to_char((timestamp + 8/24), 'MON-DD-YYYY HH24:MI:SS')||','||
txn_amount||','||se_respcode
from mi3_txn_logs 
where client_id = 'test'
and (timestamp + 8/24) between to_date(trunc((SYSDATE + 8/24) - 7)||' 08:00:00', 'MM/DD/YYYY HH24:MI:SS')
and to_date(trunc((SYSDATE + 8/24) - 0)||' 07:59:59', 'MM/DD/YYYY HH24:MI:SS')
order by logtime desc;

当我在 sqldeveloper 中执行此查询时,它工作正常。 (我想)。但是当我在 sqlplus 中运行它时,我得到了这个错误

and to_date(trunc((SYSDATE + 8/24) - 0)||' 07:59:59', 'MM/DD/YYYY HH24:MI:SS')
                                        *
ERROR at line 10:
ORA-01858: a non-numeric character was found where a numeric was expected

这是我通过 SQLPLUS 执行的完整 SQL 文件:

SET TRIMSPOOL ON;
SET HEADING OFF FEEDBACK OFF TERMOUT OFF ECHO OFF PAGESIZE 50000 LINESIZE 238 WRAP OFF;
SPOOL /home/ec2-user/out.csv;
select request_rrn||','||transfer_id||','||
client_id||','||src_fund_acct_id||','||
tgt_fund_acct_id||','||
to_char((timestamp + 8/24), 'MON-DD-YYYY HH24:MI:SS')||','||
txn_amount||','||se_respcode
from mi3_txn_logs 
where client_id = 'test'
and (timestamp + 8/24) between to_date(trunc((SYSDATE + 8/24) - 1)||' 08:00:00', 'MM/DD/YYYY HH24:MI:SS')
and to_date(trunc((SYSDATE + 8/24) - 0)||' 07:59:59', 'MM/DD/YYYY HH24:MI:SS')
order by logtime desc;
SPOOL OFF;
quit

我认为我的 SYSDATE 和硬编码时间连接存在问题。有什么想法吗?

【问题讨论】:

    标签: sql oracle type-conversion to-date


    【解决方案1】:

    您在此处嵌套隐式数据类型转换。

    to_date(trunc((SYSDATE + 8/24) - 0) 部分将使用当前 NLS 设置将trunc((SYSDATE + 8/24)(即DATE)的结果转换为VARCHAR,然后将VARCHAR 转换回DATE——它是开始。

    您需要将“截断”日期转换为格式正确的VARCHAR,然后然后to_date() 应用于串联结果。

    to_date(to_char(trunc(SYSDATE + 8/24), 'MM/DD/YYYY')||' 07:59:59', 'MM/DD/YYYY HH24:MI:SS')
    

    (我删除了- 0以减少表达式中的噪音并减少括号)

    您还需要将此应用于其他表达式


    不相关,但是:我更喜欢使用适当的间隔以获得更好的可读性:

    timestamp + interval '8' hour 而不是timestamp + 8/24

    【讨论】:

    • 谢谢!在看到这篇文章之前,我实际上已经开始工作了。这正是我所做的!非常好!
    猜你喜欢
    • 2011-07-07
    • 1970-01-01
    • 2017-07-15
    • 1970-01-01
    • 1970-01-01
    • 2012-02-14
    • 2020-08-04
    • 2011-10-04
    • 2015-03-16
    相关资源
    最近更新 更多