如何使用 sysdate 更新日期列,包括动态 sql 中的时间戳

Posted

技术标签:

【中文标题】如何使用 sysdate 更新日期列,包括动态 sql 中的时间戳【英文标题】:How to update a date column with sysdate including timestamp in a dynamic sql 【发布时间】:2015-02-04 05:49:18 【问题描述】:
    CREATE OR REPLACE PROCEDURE TESTPROC
IS
   l_update_str   VARCHAR2 (4000);
BEGIN
   l_update_str :=
      'UPDATE XX_TABLE 
             last_update_date = ''' || SYSDATE || ''',
       WHERE     1=1';

   EXECUTE IMMEDIATE l_update_str;
END;
/

我在上面尝试过,但它不起作用。我也尝试过使用 to_date(to_char(sysate)) 但缺少时间戳

【问题讨论】:

【参考方案1】:

我也尝试过使用 to_date(to_char(sysate)) 但缺少时间戳

这样做没有意义。

为什么要使用 PL/SQL 来完成如此微不足道的任务。用普通的 SQL 来做。 UPDATE 语句的简单语法是 -

UPDATE table_name SET column_name = SYSDATE WHERE <conditions>

要显示日期列,只需使用 TO_CHAR 和适当的 FORMAT MODEL

SELECT TO_CHAR(column_name, 'MM/DD/YYYY HH24:MI:SS') FROM table_name;

例如,

SQL> create table t(a date);

Table created.

SQL> insert into t values(sysdate - 10);

1 row created.

SQL> select * from t;

A
---------
25-JAN-15

SQL> update t set a = sysdate;

1 row updated.

SQL> select to_char(a, 'mm/dd/yyyy hh24:mi:ss') dt from t;

DT
-------------------
02/04/2015 11:29:21

SQL>

UPDATE关于动态SQL。

'更新 XX_TABLE 上次更新日期 = ''' ||日期 || ''', WHERE 1=1';

首先,更新语法是错误的。 SET 关键字丢失。

其次,您不能像在动态 SQL 中那样使用 SYSDATE。

由于您正在形成动态 sql,因此 sysdate 值将附加到 SQL 中。测试任何动态 sql 的最佳方法是使用 DBMS_OUTPUT 并查看动态 SQL 的格式是否正确。

例如,

SQL> CREATE OR REPLACE
  2  PROCEDURE TESTPROC
  3  IS
  4    l_update_str VARCHAR2 (4000);
  5  BEGIN
  6    l_update_str := 'UPDATE t
  7  SET a = ' || SYSDATE;
  8    --EXECUTE IMMEDIATE l_update_str;
  9
 10    DBMS_OUTPUT.PUT_LINE(l_update_str);
 11  END;
 12  /

Procedure created.

SQL> exec testproc;
UPDATE t
SET a = 02/04/2015 11:46:53

PL/SQL procedure successfully completed.

SQL>

那么,您看到形成的 SQL 了吗?附加 SYSDATE 值,而不是实际使用关键字 SYSDATE

所以,你需要稍微改变一下动态sql。

SQL> CREATE OR REPLACE
  2  PROCEDURE TESTPROC
  3  IS
  4    l_update_str VARCHAR2 (4000);
  5  BEGIN
  6    l_update_str := 'UPDATE t
  7  SET a = SYSDATE';
  8    --EXECUTE IMMEDIATE l_update_str;
  9
 10    DBMS_OUTPUT.PUT_LINE(l_update_str);
 11  END;
 12  /

Procedure created.

SQL> exec testproc;
UPDATE t
SET a = SYSDATE

PL/SQL procedure successfully completed.

SQL>

现在上面可以正常工作了。

【讨论】:

谢谢你.. 我刚刚知道不需要连接 sysdate。【参考方案2】:

只需输入 systimestamp 设置列中的时间戳。

CREATE OR REPLACE PROCEDURE TESTPROC
IS
   l_update_str   VARCHAR2 (4000);
BEGIN
   l_update_str :=
      'UPDATE test1
set name1 = SYSTIMESTAMP(6)
where 1=1';

   EXECUTE IMMEDIATE l_update_str;
END;

【讨论】:

DATE 数据类型同时具有日期和时间值。时间戳是日期数据类型的扩展。在 OP 的情况下不需要时间戳。

以上是关于如何使用 sysdate 更新日期列,包括动态 sql 中的时间戳的主要内容,如果未能解决你的问题,请参考以下文章

如何在当前日期和当前日期 + 2 之间提取数据但不包括周末?

Oracle - 将日期列与 sysdate 进行比较

Oracle:类似于 sysdate 但只返回时间和日期

Mysql的日期时间使用说明

SQL计算年龄

如何生成 sysdate-30 和 sysdate+30 之间的所有日期列表?