我经常在公司里看到这种代码,在一个程序里
begin execute immediate 'alter session set nls_date_format = ''yyyy-mm-dd''' ; .......
这有什么意义,或者在什么情况下我们需要使用这个语句?因为在PLSQL中我们已经设置了时间格式,所以这让我感到困惑,我认为这是无用的!
9vw9lbht1#
在Oracle中,NLS_DATE_FORMAT用作格式模型,以隐式地将日期转换为字符串或将字符串转换为日期。如果您这样做:
NLS_DATE_FORMAT
SELECT TO_DATE('27-03-2023') FROM DUAL;
那么这实际上等于:
SELECT TO_DATE( '27-03-2023', (SELECT value FROM NLS_SESSION_PARAMETERS WHERE parameter = 'NLS_DATE_FORMAT') ) FROM DUAL;
如果NLS_DATE_FORMAT是DD-MM-YYYY(或等价物),则隐式转换将起作用,但是如果NLS_DATE_FORMAT不等价,则查询将失败(或给予错误的结果)。类似地,使用:
DD-MM-YYYY
SELECT TO_CHAR(DATE '2023-03-27') FROM DUAL;
SELECT TO_CHAR( DATE '2023-03-27', (SELECT value FROM NLS_SESSION_PARAMETERS WHERE parameter = 'NLS_DATE_FORMAT') ) FROM DUAL;
并且它将根据NLS_DATE_FORMAT会话参数的当前值进行格式化。这有什么意义,或者在什么情况下我们需要使用这个语句?因为在PLSQL中我们已经设置了时间格式如果您总是用途:
TO_DATE(string_value, format_model) TO_CHAR(date_value, format_model)
并在第二个参数中显式指定格式模型,则这是毫无意义的。如果您不总是指定格式模型并依赖隐式转换,则可以确保隐式转换始终使用正确的格式模型。然而,隐式转换被认为是不好的做法,最好总是指定格式模型,并在下次更新这些过程和函数时删除动态调用以设置NLS_DATE_FORMAT。
iqjalb3h2#
alter session set nls_date_format = 'yyyy-mm-dd'
这是为显示和(可能更重要的是)各种命令中的输入设置默认日期格式。这意味着仅在当前会话的范围内更改默认值,而不是为所有用户或作为数据库的持久更改。当无法假定当前值时,由于特定的格式要求,它可能包含在脚本或过程中:显式地设置这样的值以确保正确的操作,而不是依赖于外部定义的默认值,这是一种很好的做法。例如,当恢复目标是特定的时间戳并且默认输入过滤器需要匹配稍后在恢复命令中使用的格式时,它通常用于时间点恢复操作等情况。
2条答案
按热度按时间9vw9lbht1#
在Oracle中,
NLS_DATE_FORMAT
用作格式模型,以隐式地将日期转换为字符串或将字符串转换为日期。如果您这样做:
那么这实际上等于:
如果
NLS_DATE_FORMAT
是DD-MM-YYYY
(或等价物),则隐式转换将起作用,但是如果NLS_DATE_FORMAT
不等价,则查询将失败(或给予错误的结果)。类似地,使用:
那么这实际上等于:
并且它将根据
NLS_DATE_FORMAT
会话参数的当前值进行格式化。这有什么意义,或者在什么情况下我们需要使用这个语句?因为在PLSQL中我们已经设置了时间格式
如果您总是用途:
并在第二个参数中显式指定格式模型,则这是毫无意义的。
如果您不总是指定格式模型并依赖隐式转换,则可以确保隐式转换始终使用正确的格式模型。然而,隐式转换被认为是不好的做法,最好总是指定格式模型,并在下次更新这些过程和函数时删除动态调用以设置
NLS_DATE_FORMAT
。iqjalb3h2#
这是为显示和(可能更重要的是)各种命令中的输入设置默认日期格式。这意味着仅在当前会话的范围内更改默认值,而不是为所有用户或作为数据库的持久更改。当无法假定当前值时,由于特定的格式要求,它可能包含在脚本或过程中:显式地设置这样的值以确保正确的操作,而不是依赖于外部定义的默认值,这是一种很好的做法。例如,当恢复目标是特定的时间戳并且默认输入过滤器需要匹配稍后在恢复命令中使用的格式时,它通常用于时间点恢复操作等情况。