oracle 判断今天是星期几

有人问怎么判断今天是星期几?

select to_char(sysdate,'d') from dual

    很显然这句并不能完成要求的功能,因为这只是显示当前为本星期的第几天,而老外把星期天当作每个星期的第一天,那么变通的方法就是求前一天为该周的第几天,不就相当于今天为星期几了么:

select to_char(sysdate - 1,'d') from dual

中午显示方法:

SQL> select to_char(sysdate,'day') day from dual;

DAY
------
星期日


英文显示方法:

SQL> select to_char(sysdate,'day','NLS_DATE_LANGUAGE=AMERICAN') day from dual;

DAY
---------
sunday


当然你也可以直接改变当前 session 的语言设置:


SQL> ALTER SESSION SET NLS_DATE_LANGUAGE='AMERICAN';

会话已更改。

SQL> select to_char(sysdate,'day') day from dual;

DAY
---------
sunday

 

 

<think>在Oracle中,我们可以使用TO_CHAR函数和日期格式化模型来获取日期的星期信息。具体来说,我们可以使用:TO_CHAR(sysdate,'D')--返回一周中的第天(1=星期日,2=星期一,...,7=星期六),注意这取决于NLS设置,可能周日是1或周一为1。或者TO_CHAR(sysdate,'DAY')--返回星期的全称(如SUNDAY,MONDAY等,大小写和语言取决于NLS设置)但是,需要注意NLS_TERRITORY设置可能会影响一周的第一天是星期日还是星期一。如果我们想要一个标准的ISO星期(周一=1,周日=7),可以使用:TO_CHAR(sysdate,'D')可能不够稳定,因为不同地区设置结果不同。更可靠的方式是使用ISO标准:ISO星期一到星期日分别对应1到7,可以用:TO_CHAR(sysdate,'IW')返回ISO标准的周数,但是不直接返回星期。实际上,我们可以用:TO_CHAR(sysdate,'D')会返回1到7,但起始日取决于会话参数。为了确保周一为1,周日为7,我们可以调整:在ISO标准中,可以使用以下方法:SELECTTO_CHAR(sysdate,'fmD')ASweekday_numFROMdual;--这取决于NLS设置为了独立于NLS设置,我们可以使用:SELECTTRUNC(sysdate)-TRUNC(sysdate,'IW')+1ASiso_weekdayFROMdual;解释:TRUNC(sysdate,'IW')返回本周第一天(按ISO标准:星期一),然后sysdate减去这个日期,得到的是天数差,然后加1(因为星期一我们希望是1)但是这样计算出来的星期一是0+1=1,星期二是1+1=2,...星期日是6+1=7。这样符合ISO标准。但是,如果我们只需要星期的名称,并且不介意依赖NLS设置,那么直接用TO_CHAR(,'DAY')就可以。所以,具体方法有:1.获取星期数字(1-7,ISO标准,星期一到星期日对应1到7):方法:SELECTTO_CHAR(sysdate,'D')FROMdual;--不稳定的,依赖NLSSELECTTO_CHAR(sysdate,'fmD')FROMdual;--同上,只是去掉了前面的空格(如果使用DAY会有空格)独立于NLS的方法:SELECTTRUNC(sysdate)-TRUNC(sysdate,'IW')+1FROMdual;2.获取星期的名称:SELECTTO_CHAR(sysdate,'DAY')FROMdual;--返回当前会话语言星期名称,比如“星期一”或“MONDAY”SELECTTO_CHAR(sysdate,'DY')FROMdual;--返回缩写的星期名称3.如果想要英文名称而不依赖当前会话设置,可以指定语言:SELECTTO_CHAR(sysdate,'DAY','NLS_DATE_LANGUAGE=ENGLISH')FROMdual;示例代码:今天(系统日期)是周数字1-7,星期一为1,星期日为7):独立于NLS的方法:SELECTTRUNC(SYSDATE)-TRUNC(SYSDATE,'IW')+1ASISO_WEEKDAYFROMDUAL;今天(系统日期)的星期名称(英文):SELECTTO_CHAR(SYSDATE,'DAY','NLS_DATE_LANGUAGE=ENGLISH')ASWEEK_DAYFROMDUAL;注意:TRUNC(date,'IW')按ISO标准返回本周星期一的日期。因此,我们给出以下两种情况的代码:</think> ### Oracle判断当前日期是周的方法 在Oracle中,最常用的方法是使用`TO_CHAR`函数配合日期格式化模型。以下是种实现方式: #### 方法1:使用`TO_CHAR(date, 'D')`(星期数字) ```sql SELECT TO_CHAR(SYSDATE, 'D') AS day_of_week FROM dual; ``` **解释**: - `'D'`格式返回1-7的数字表示(1=周日,2=周一,...,7=周六) - 简单直接但结果依赖NLS_TERRITORY设置(某些区域可能周一作为第一天) #### 方法2:使用`TO_CHAR(date, 'DAY')`(全称星期名) ```sql SELECT TRIM(TO_CHAR(SYSDATE, 'DAY')) AS week_day FROM dual; ``` **解释**: - `'DAY'`格式返回星期全称(如"MONDAY") - `TRIM()`移除尾部空格(Oracle默认右补空格到9字符长度) - 语言依赖NLS_DATE_LANGUAGE设置 #### 方法3:显式指定语言(推荐) ```sql SELECT TO_CHAR( SYSDATE, 'DAY', 'NLS_DATE_LANGUAGE=ENGLISH' ) AS english_weekday FROM dual; ``` **解释**: - 指定`NLS_DATE_LANGUAGE=ENGLISH`确保返回英文名称 - 避免区域设置差异导致的问题 #### 方法4:使用`TO_CHAR(date, 'Dy')`(缩写) ```sql SELECT TO_CHAR(SYSDATE, 'Dy') AS weekday_short FROM dual; ``` **解释**: - `'Dy'`格式返回星期缩写(如"Mon") - 返回值为大写,长度固定为3个字符 #### 方法5:使用ISO标准(周一为1) ```sql SELECT TO_CHAR(SYSDATE, 'fmD') AS iso_day FROM dual; ``` **解释**: - `fm`修饰符删除填充空格 - 符合ISO 8601标准(1=周一,7=周日) **完整判断示例**: ```sql SELECT CASE TO_CHAR(SYSDATE, 'D') WHEN '1' THEN 'Sunday' WHEN '2' THEN 'Monday' WHEN '3' THEN 'Tuesday' WHEN '4' THEN 'Wednesday' WHEN '5' THEN 'Thursday' WHEN '6' THEN 'Friday' WHEN '7' THEN 'Saturday' END AS day_name FROM dual; ``` **输出示例**: ``` WEEK_DAY -------- Wednesday ``` **注意事项**: 1. 周起始依据`NLS_TERRITORY`设置(美国:周日为第1天,欧洲:周一为第1天) 2. 使用`ALTER SESSION SET NLS_TERRITORY = 'AMERICA';`可临时修改设置 3. 长期使用的系统推荐显式指定语言参数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值