0

我有一个包含 TIMESTAMP(6) 类型的列的表,如果我尝试查询该表,只要我不对其进行参数化,一切都很好。

这有效:

SELECT
  COUNT(*)
FROM
  t_data
WHERE
  DATA_TS >= TO_TIMESTAMP('13.09.18 11:30:00')
  AND   DATA_TS <= TO_TIMESTAMP('13.09.18 11:33:00');

但是,这会失败,因为 ORA-01858“在需要数字的地方发现了一个非数字字符”,提供了上述值。我还尝试使用 NLS_PARAMETERS 中的格式掩码将参数包装在 TO_TIMESTAMP() 中。

SELECT
  COUNT(*)
FROM
  t_data
WHERE
  DATA_TS >= TO_TIMESTAMP(:AStart,'DD.MM.RR HH24:MI:SSXFF')
  AND   DATA_TS <= TO_TIMESTAMP(:AEnd,'DD.MM.RR HH24:MI:SSXFF');

任何人都知道是什么导致了这个问题?

测试用例:创建表

create table t_data ( 
    data varchar2(80), 
    data_ts timestamp 
);

插入数据

Insert into t_data (data,data_ts) VALUES ('TEST', systimestamp);

使用 &AStart 代替 :AStart 效果很好,如果这对某人有帮助的话

4

4 回答 4

2

您不能TO_TIMESTAMP('13.09.18 11:30:00')将内容用作绑定变量。DBMS 需要一个值,而不是代码。

因此,如果您的工具或编程语言允许,您要么传递时间戳或日期值,要么'13.09.18 11:30:00'只传递字符串并TO_DATE(:AStart, 'dd.mm.rr hh24:mi:ss')在查询中包含。

更新:确保在将字符串作为绑定变量传递时不要包含引号。仅传递字符串内容(例如13.09.18 11:30:00,not '13.09.18 11:30:00')。

于 2018-09-18T08:12:35.643 回答
1

真的是时间戳吗?因为,你发布的价值观对我来说就像普通的约会。

无论如何:我相信您应该使用TO_TIMESTAMP并为参数值提供适当的格式掩码。不是您应该应用 NLS 设置格式掩码,而是您在键入该参数的值时使用的那个。

例如:

SQL> alter session set nls_date_format = 'dd.mm.yyyy hh24:mi:ss';

Session altered.

SQL> select sysdate from dual;

SYSDATE
-------------------
18.09.2018 10:07:57

SQL> select to_timestamp('&par_ts', 'dd.mm.yy hh24:mi:ss') result from dual;
Enter value for par_ts: 18.09.18 10:08:23

RESULT
---------------------------------------------------------------------------
18.09.18 10:08:23,000000000

SQL>

如果您传递了不同格式的参数,格式掩码必须反映该更改:

SQL> select to_timestamp('&par_ts', 'mm-yyyy-dd hh24:mi:ss') result from dual;
Enter value for par_ts: 09-2018-18 10:10:15

RESULT
---------------------------------------------------------------------------
18.09.18 10:10:15,000000000

SQL>

这意味着您的查询应如下所示:

SELECT COUNT(*)
FROM  t_data
WHERE DATA_TS >= TO_TIMESTAMP(:AStart, 'dd.mm.yy hh24:mi:ss')
  AND DATA_TS <= TO_TIMESTAMP(:AEnd, 'dd.mm.yy hh24:mi:ss');

如有必要,请修复格式掩码。

于 2018-09-18T08:12:23.337 回答
1

感谢大家的贡献。我一直在错误的轨道上。

卸载旧版本的 SQL Developer 并安装当前版本后,问题消失了。我不知道是什么原因造成的,但它已经解决了。

结果是我现在对时间和日期格式有了更多的了解。

问候阿提克斯

于 2018-09-18T10:29:11.597 回答
1

您应该在函数内使用 param

SELECT   COUNT(*)
FROM  t_data
WHERE   DATA_TS >= TO_TIMESTAMP(:AStart)
  AND   DATA_TS <= TO_TIMESTAMP(:AEnd);
于 2018-09-18T07:23:44.093 回答