[20241222]关于日期输出格式问题.txt
--//https://connor-mcdonald.com/ 网站写了一系列相关blog,命名为Kris Kringle系列。
--//其中链接提到的例子https://connor-mcdonald.com/2024/12/21/kris-kringle-the-database-what-day-is-it/
--//重复测试:
1.环境:
SCOTT@book01p> @ ver2
==============================
PORT_STRING : x86_64/Linux 2.4.xx
VERSION : 21.0.0.0.0
BANNER : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
BANNER_FULL : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
Version 21.3.0.0.0
BANNER_LEGACY : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
CON_ID : 0
PL/SQL procedure successfully completed.
2.测试:
SCOTT@book01p> select '~'||to_char(sysdate,'DAY')||'~' from dual;
'~'||TO_CHAR(SY
---------------
~SUNDAY ~
--//实际上输出是char类型,注意结尾有空格,占用9个字符。规避后面的空格要加入FM。
SCOTT@book01p> select '~'||to_char(sysdate,'FMDAY')||'~' from dual;
'~'||TO_CHAR(SY
---------------
~SUNDAY~
--//实际上在输出格式上还有一些细节,看下面的例子:
$ echo {D,d}{A,a}{Y,y}
DAY DAy DaY Day dAY dAy daY day
$ echo set feed off head off ; echo -e {D,d}{A,a}{Y,y}"\n" | xargs -IQ echo "select 'Q',to_char(sysdate,'Q') from dual ;"
set feed off head off
select 'DAY',to_char(sysdate,'DAY') from dual ;
select 'DAy',to_char(sysdate,'DAy') from dual ;
select 'DaY',to_char(sysdate,'DaY') from dual ;
select 'Day',to_char(sysdate,'Day') from dual ;
select 'dAY',to_char(sysdate,'dAY') from dual ;
select 'dAy',to_char(sysdate,'dAy') from dual ;
select 'daY',to_char(sysdate,'daY') from dual ;
select 'day',to_char(sysdate,'day') from dual ;
$ (echo set feed off head off ; echo -e {D,d}{A,a}{Y,y}"\n" | xargs -IQ echo "select 'Q' str ,to_char(sysdate,'Q') to_c from dual ;")| sqlplus -s -l / as sysdba | sed '/^$/d'
DAY MONDAY
DAy MONDAY
DaY Monday
Day Monday
dAY monday
dAy monday
daY monday
day monday
--//自己可以总结其中的差别:
--//1.格式前面2个字符大写的,输出全部大写。
--//2.格式第1个字符大写的,第2个小写的,输出第1个字符大写,其他小写。
--//3.格式第1个字符小写的,输出全部小写。
--//这些大概属于英语的习惯用法。
3.画外:
--//之所以提及这些问题,最近正好在优化一个项目,我发现写代码看谓词出现类型如下情况:
TO_CHAR (SCHEDULED_DATE_TIME, 'yyyyMMdd') = TO_CHAR (SYSDATE, 'yyyyMMdd')
OR (START_DATE_TIME >= :startTime AND START_DATE_TIME <= :endTime)
--//视乎是对方的一种编程风格,T大写视乎很容易看出前面start,end是否写错。
--//前面的MM例子也是这样,也许这样容易看清前面的y有4个。
> @ sql_id a5a47dnwfd100
-- SQL_ID = a5a47dnwfd100 come from shared pool
SELECT d.label as dept,substr(t.RECORDDATE,0,10) as 日期,count (*) AS 人数
FROM TEMPERATURE t left join s_departments d on d.CODE=t.dept
where to_date(t.RECORDDATE,'yyyy-MM-dd hh24:mi:ss')+7 >sysdate and value >=37.3
GROUP by d.label,substr(t.RECORDDATE,0,10)
order by substr(t.RECORDDATE,0,10) desc;
--//我不知道为什么,大部分代码出现的格式中间的MM都是选择大写,感觉很怪异,当然也许是编写者的一个风格。
--//不过关于谓词使用函数,这些已经讲了许多次,还是有人这样写,当然建立函数索引问题就可以解决(最后1个不行),看着这样开发
--//人员不不知道是同情还是鄙视,如果没人指出,写一辈子代码还是这样,那真是一种悲哀!!