在oracle中定义数据库的日期格式

时间:2011-02-04 20:47:38

标签: sql oracle ora-01861

我正在尝试执行以下SQL:

INSERT INTO "x" 
   ("x_id", "requested_function", "user_action", "t_users_id", "date", "wf_process", "details") 
VALUES 
   ('66', 'index', 'view', '1', '2011-02-04 22:14:19', '15', '');

..但我收到此错误:ORA-01861:文字与格式字符串不匹配。

如果我添加如下日期格式,则此错误已解决:

INSERT INTO "x" 
  ("x_id", "requested_function", "user_action", "t_users_id", "date", "wf_process", "details") 
VALUES 
  ('66', 'index', 'view', '1',to_date('2011-02-04 22:14:19','yyyy-mm-dd hh24:mi:ss'), '15', '');

我不想为每个SQL语句定义日期格式,我希望这种格式是数据库中所有日期字段的标准格式,而不需要定义它,换句话说,第一个SQL语句必须正确运行没有任何错误。

我可以为oracle数据库定义日期格式,所以不需要再用每个SQL语句定义它吗?

3 个答案:

答案 0 :(得分:6)

这是考虑编程的错误方法。隐含是坏的,显性是好的。如果您只是将字符串抛入数据列并希望默认值按预期工作,则很可能会产生错误和性能问题。

但是,对我来说,要避免得到这个问题的答案。

更改NLS_DATE_FORMAT初始化参数。

答案 1 :(得分:1)

这是非常糟糕的SQL。两个问题:1)Oracle将无法优化(每次运行查询时都必须解析),使数据库操作变慢; 2)您对SQL注入攻击持开放态度。

将参数化查询与预处理语句一起使用会更好,这将解决上述问题和日期格式问题。

编辑:要直接回答你的问题,如果你真的不想转换到准备好的陈述(你已经被警告了!),那么你可以这样做一些:

INSERT INTO X VALUES (99, TO_DATE('2010/02/04 16:30:00', 'YYYY/MM/DD HH24:MI:SS'));

但同样,由于上述原因,这是一个非常糟糕的主意

答案 2 :(得分:0)

日期和时间文字的SQL92标准是这里的方法。

TIMESTAMP 'YYYY-MM-DD HH:MM:SS'
DATE 'YYYY-MM-DD'
TIME 'HH:MM:SS'

使用它的一个例子是:

INSERT INTO X VALUES (99, TIMESTAMP '2010-02-04 16:30:00');