|
|
本帖最后由 likeyouli 于 2025-10-6 09:17 编辑
第一步:首先查询当前会话的nls_date_format的设置(当前会话是目前生效的设置,如外还有数据库实例设置nls_instance_parameters,数据库设置nls_database_parameters):
select * from nls_session_parameters 返回:DD-MON-RR
查询日期: select fyfssj from YB_FYMX_WS where rownum < 50 返回:2023-1-1 星期日
此时:select regexp_substr(fyfssj,'[0-9]+',1,1) from YB_FYMX_WS where rownum < 50 返回:01
select regexp_substr(fyfssj,'[0-9]+',1,2) from YB_FYMX_WS where rownum < 50 返回:1
select regexp_substr(fyfssj,'[0-9]+',1,3) from YB_FYMX_WS where rownum < 50 返回23
第二步:更改日期nls_date_format的设置为:alter session set nls_date_format = 'yyyy-mm-dd'
查询日期:select fyfssj from YB_FYMX_WS where rownum < 50 仍旧返回2023-1-1 星期日 ,貌似与上边没啥区别。
此时:
select regexp_substr(fyfssj,'[0-9]+',1,1) from YB_FYMX_WS where rownum < 50 返回:2023
select regexp_substr(fyfssj,'[0-9]+',1,2) from YB_FYMX_WS where rownum < 50 返回:01
select regexp_substr(fyfssj,'[0-9]+',1,3) from YB_FYMX_WS where rownum < 50 返回:01
通过上述设置验证,查询fyfssj同样显示为 2023-1-1 星期日 , 但由于是不同的nls_date_format 设置,会截取到(regexp_substr)不同的结果,在做日期方面的有关查询时要格外注意。
补充一下:上边的日期设置,dd会将个位数的日前边补0显示,mm会将个位数的月前边补0,如果日和月前边都不想补0,可以设置为alter session set nls_date_format = 'fmdd-MON-yyyy' 或者alter session set nls_date_format = 'yyyy-MON-fmdd' ,此时无论月份还是日为个位数时前边也不会补零0 。
|
|