如何将DB2 WEEK函数替换为Oracle函数



我正试图用Oracle DB取代DB2。

在DB2中,有一个WEEK函数,它返回一年中的周数。例如:

SELECT week('2021-01-04') FROM sysibm.sysdummy1

然后我得到2的返回(因为DB2 WEEK函数将周日视为一周中的第一天。(

但是,在Oracle中,如果我进行类似的查询,则会得到不同的值。

SELECT to_char(to_date('2021-01-04', 'YYYY-MM-DD'), 'WW') FROM dual;

我得到的值是1(而不是2,因为Oracle将1月1日视为一周的第一天。(

是否有其他周转或不同的功能来取代DB2 WEEK功能?

Oracle提供了两个年度周数函数。正如您所发现的,to_char(dt, 'WW')给出了一个数字,其中一周从1月1日开始,每七天递增一次。还有to_char(dt, 'IW')给出ISO周号,从周一到周日;在这种情况下,1月1日是第53周,2021-01-04是2021年第1周的第一天。

db<上的演示>小提琴

Oracle中没有根据星期几来增加星期数的函数。您可以编写自己的PL/SQL函数来实现这一点。


顺便说一句,Oracle中一周的第一天是由我们的NLS参数决定的。如果我们在美国环境下跑步,周日是第一天;如果我们在英国环境下跑步,那么周一是第一天。

如果您想计算一周中第一天是星期日的周数,那么:

SELECT FLOOR(
(DATE '2021-01-04' - NEXT_DAY( TRUNC( DATE '2021-01-04', 'YY' ) - INTERVAL '7' DAY, 'SUNDAY'))
/ 7
) + 1
AS week
FROM   your_input;

输出CCD_ 3。

如果你用多个输入日运行它:

WITH your_input ( value ) AS (
SELECT DATE '2021-01-01' + LEVEL - 1
FROM   DUAL
CONNECT BY LEVEL <= 32
)
SELECT value,
FLOOR(
(value - NEXT_DAY( TRUNC( value, 'YY' ) - INTERVAL '7' DAY, 'SUNDAY'))
/ 7
) + 1
AS week
FROM   your_input;

然后得到输出(以NLS_DATE_FORMAT作为YYYY-MM-DD (DY)(:

VALUE
2021-01-01(FRI(1
2021-01-02(SAT(1
2021-01-03(SUN(2
2021-01-04(MON(2
2021-01-05(TUE(2
2021-01-06(WED(2
2021-01-07(THU(2
2021-01-08(FRI(2
2021-01-09(SAT(2
2021-01-10(SUN(3
2021-01-11(MON(3
2021-01-12(TUE(3
2021-01-13(WED(3
2021-01-14(THU(3
2021-01-15(FRI(3
2021-01-16(SAT(3
2021-01-17(SUN(4
2021-01-18(MON(4
2021-19(TUE(4
2021-020(WED(4
2021-01-21(THU(4
2021-022(FRI(4
2021-01-23(SAT(4
2021-024(SUN(5
2021-025(MON(5
2021-01-26(TUE(5
2021-027(WED(5
2021-01-28(THU(5
2021-029(FRI(5
2021-01-30(SAT(5
2021-01-31(SUN(6
2021-02-01(MON(6

最新更新