我正试图用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