RETURN 1-7 iso day函数中星期的序号



我需要一点帮助。我试图创建一个函数,返回1-7其中1=星期一,2=星期二…7=星期日。

我知道2022年7月18日是星期一,我希望数字1能被退回。然而我却得到了29?

如何创建一个只返回1-7的函数为什么我得到了29?


SELECT TO_CHAR( DATE '2022-07-18' ,'IW') FROM DUAL 
29

to_char(<date>)中的'iw'是ISO周数(以年为单位),而不是ISO周内的天数。

不幸的是,由于只有Oracle知道的原因,他们没有提供一个简单的日期函数来返回ISO星期几。

作为一种解决方案,在不同的功能'trunc(<date>)'中使用相同的'iw'选项对您的问题有帮助;它将日期截断为ISO周的开始(一周的星期一,午夜)。为什么'iw'在两个不同的日期函数中意味着如此不同的东西,只有Oracle的聪明的开发人员才能告诉我们。

所以,你将不得不做一些有点乏味的事情,像这样(显示它的日期也有非零时);使用with子句来生成一些测试数据:

with
sample_data (dt) as (
select to_date('2021-03-04 22:30', 'yyyy-mm-dd hh24:mi') from dual union all
select to_date('2022-05-30 10:28', 'yyyy-mm-dd hh24:mi') from dual
)
select to_char(dt, 'Dy dd-Mon-yyyy')   as dt,
trunc(dt) - trunc(dt, 'iw') + 1 as iso_day_of_week
from   sample_data
;
DT                      ISO_DAY_OF_WEEK
----------------------- ---------------
Thu 04-Mar-2021                       4
Mon 30-May-2022                       1

警告:to_char(<date>)有一个显示"星期几"的选项。-但这对你来说是无用的,因为它返回在NLS设置中编码的区域设置中的星期几,而不是标准的"ISO星期几";你说你需要。

编辑-每个OP的请求,这里是如何相同的可以包装在一个PL/SQL函数,可以从SQL调用。注意pragma udf指令(从Oracle 12开始可用)-当在SQL上下文中调用该函数时,它使代码更高效。

create or replace function iso_day_of_week(dt date)
return number
deterministic
as
pragma udf;
begin
return trunc(dt, 'iw') - trunc(dt) + 1;
end;
/

对上面的样本数据进行相同的测试:

with
sample_data (dt) as (
select to_date('2021-03-04 22:30', 'yyyy-mm-dd hh24:mi') from dual union all
select to_date('2022-05-30 10:28', 'yyyy-mm-dd hh24:mi') from dual
)
select to_char(dt, 'Dy dd-Mon-yyyy') as dt,
iso_day_of_week(dt)           as iso_day_of_week
from   sample_data
;
DT                      ISO_DAY_OF_WEEK
----------------------- ---------------
Thu 04-Mar-2021                       4
Mon 30-May-2022                       1

'IW'返回一年中的星期,您需要'D'表示星期几。根据NLS设置,星期一将返回1或2。

最新更新