oracle更新日期格式掩码

oracle更新日期格式掩码,oracle,plsql,Oracle,Plsql,我有这个程序,我需要生日字段的格式为2018年7月16日,但当我运行程序时,它会更新为2018年7月16日的格式。 如何以想要的格式更新它 PROCEDURE update_affiliate (pid NUMBER, i_username VARCHAR2, i_first_name VARCHAR

我有这个程序,我需要生日字段的格式为2018年7月16日,但当我运行程序时,它会更新为2018年7月16日的格式。 如何以想要的格式更新它

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;

您不需要使用
to_DATE
i_birth
转换为
日期
,因为它已经是
日期
数据类型。只需使用:

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;
如何以想要的格式更新它

这是一种常见的误解,即数据库中的日期具有格式

日期没有格式-它是(表示年、月、日、小时、分钟和秒),直到您使用的任何用户界面(如SQL/Plus、SQL Developer、Java等)尝试向您(用户)显示它,并将其转换为您认为有意义的内容(通常是字符串)为止为日期指定一种格式,以便您(用户)在客户端软件上发现它有意义

由于您正在传递一个
日期
,因此无需执行任何操作

你可能想问的是:

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

如果您使用的是SQL/Plus或SQL Developer,那么它将使用
NLS\u DATE\u FORMAT
session参数格式化日期。你可以:

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

您还可以根据需要在SQL Developer GUI中更改首选项

或者您可以使用
来设置字符
并设置所需的格式:

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

正如你所想,这不是储蓄的问题,而是视力的问题。首先,这不是一个问题-日期以格式显示,具体取决于您的NLS_日期格式。NLS_语言美国NLS_领土美国NLS_货币$NLS_ISO_货币美国NLS_数字字符。,NLS\U日历公历NLS\U日期格式DD-MON-RR NLS\U日期语言美国NLS\U字符集AL32UTF8 NLS\U排序二进制NLS\U时间格式HH.MI.SSXFF AM NLS\U时间戳格式DD-MON-RR HH.MI.SSXFF AM NLS\U时间戳格式HH.MI.SSXFF AM TZR NLS\U时间戳格式DD-MON-RR HH.MI.SSXFF AM TZR NLS双币种$16字符集NLS_COMP BINARY NLS_LENGTH_SEMANTICS BYTE NLS_NCHAR_CONV_EXCP FALSE这是我在运行select*fron V$NLS_parameters时得到的结果。无论如何,对已经是日期的值调用
to_date()
。这将首先将
date
值转换为
varchar
,只需将
varchar
转换回最初的
date
。是的,我的同事说是dd-mon-rr格式,只需找到显示的函数并将其更改为rrrrrr格式。感谢您的解释。@civesuas\u sine不幸的是,您的同事不太正确-它没有“以[XYZ]格式或任何格式获取[日期]”-它只获取7个未格式化字节,一旦获得未格式化数据,您就可以使用用户界面(SQL/Plus、SQL开发人员、Java等)将在尝试显示时应用其默认格式。您的问题是您不想要默认格式,需要更改默认格式,或者最好使用
to_CHAR
来显式设置所需格式。我正在使用TOAD,并且在nls参数中nls_date_format设置为dd mon rr。。我可以在那里更改它,但它仅对该会话有效。如何保存它以保持不变?@civesuas\u sine最好的解决方案是将查询修改为使用
到\u CHAR
,并显式设置格式模型,这样您就不必修改会话参数(因此,对于运行查询的所有用户,输出都是一致的)。另一种解决方案是在登录触发器中设置
NLS\u DATE\u格式
(但这并不阻止稍后在会话中更改格式,然后您的输出将更改)。
SELECT party_id,
       username,
       first_name,
       TO_CHAR( birthday, 'DD-MON-YYYY' ) AS birthday
FROM   affiliate_v