奇怪的 TO_DATE 和 SQLPLUS 行为
Strange TO_DATE and SQLPLUS behavior
我有一个提供 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 和硬编码时间连接有问题。有什么想法吗?
您正在此处嵌套隐式数据类型转换。
部分 to_date(trunc((SYSDATE + 8/24) - 0)
将使用当前 NLS 设置将 trunc((SYSDATE + 8/24)
的结果(即 DATE
- 转换为 VARCHAR
,然后将 VARCHAR
回到 DATE
- 它是开始的。
您需要将 "truncated" 日期转换为格式正确的 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
我有一个提供 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 和硬编码时间连接有问题。有什么想法吗?
您正在此处嵌套隐式数据类型转换。
部分 to_date(trunc((SYSDATE + 8/24) - 0)
将使用当前 NLS 设置将 trunc((SYSDATE + 8/24)
的结果(即 DATE
- 转换为 VARCHAR
,然后将 VARCHAR
回到 DATE
- 它是开始的。
您需要将 "truncated" 日期转换为格式正确的 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