oracle更新日期格式掩码

时间:2018-07-16 09:14:53

标签: oracle plsql

我有此过程,我需要生日字段的格式为16-JUL-2018,但是当我运行过程时,它会以16-JUL-18格式更新。 如何以所需格式更新它?

PROCEDURE update_affiliate (pid                NUMBER,
                                   i_username         VARCHAR2,
                                   i_first_name       VARCHAR2,                              
                                   i_birthday         DATE)
       IS
       BEGIN
          UPDATE   affiliate_v
             SET   username = UPPER (i_username),
                   first_name = i_first_name,
                   birthday = TO_DATE(i_birthday,'DD-MON-YYYY'),
           WHERE   party_id = pid;

       END update_affiliate;

1 个答案:

答案 0 :(得分:6)

您不需要使用i_birthdayDATE转换为TO_DATE,因为它已经是DATE数据类型。只需使用:

PROCEDURE update_affiliate (
  pid                NUMBER,
  i_username         VARCHAR2,
  i_first_name       VARCHAR2,                              
  i_birthday         DATE)
IS
BEGIN
  UPDATE affiliate_v
  SET    username   = UPPER (i_username),
         first_name = i_first_name,
         birthday   = i_birthday,
  WHERE  party_id   = pid;
END update_affiliate;
  

如何以所需格式更新它?

这是一个常见的误解,认为数据库中的日期具有格式。

日期没有格式-它是stored internally to the database as 7-bytes(代表年,月,日,小时,分钟和秒),并且直到您使用的任何用户界面(即SQL / Plus,SQL)都没有开发人员,Java等)尝试向您(用户)显示它,并将其转换为您认为有意义的东西(通常是字符串),并为日期指定格式,以便您(用户)在客户端上找到有意义的东西软件。

由于您传递了DATE,因此您无需执行任何操作。

您可能想问的是:

  

现在我已经更新了日期,如何获取用户界面以查询表时想要的格式显示日期?

如果您使用的是SQL / Plus或SQL Developer,则它将使用NLS_DATE_FORMAT会话参数来格式化日期。您可以change this using

ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YYYY';

注意:这是一个会话参数,只会更改当前会话的格式(不会更改任何其他用户或任何后续会话的格式)。

您还可以在SQL Developer GUI中将首选项更改为described here

或者您可以只使用TO_CHAR并设置所需的格式:

SELECT party_id,
       username,
       first_name,
       TO_CHAR( birthday, 'DD-MON-YYYY' ) AS birthday
FROM   affiliate_v