所以我有一个shell脚本,它使用SQL查询返回周数:
select TO_CHAR(TO_DATE('01/01/2022','DD/MM/YYYY'),'fmWW') as WEEK from dual;
此查询返回1。(从1月1日开始)
Python代码:我尝试过以下方法,但它返回52而不是1:
week=datetime.date(2022,1,1).isocalendar()[1]
从周一至周日开始的一周
有没有其他方法可以让我从1月1日开始计算每年的周数2022年1月1日我得到1?
所需输出:
Week ending Jan 2 2022 = 1
Week ending Jan 9 2022 = 2
Week ending Jan 16 2022 = 3
有没有其他方法可以让我从1月1日开始获得年份的周数,这样我就可以在2022年1月获得1?
您可以在给定日期使用dt
,正如您在问题中所说:
TO_CHAR(dt, 'fmWW')
或者可以使用计算
FLOOR((dt - TRUNC(dt, 'YY'))/7)+1
或者,为了匹配python代码,可以使用获得ISO周
TO_CHAR(dt, 'fmIW')
或者,如果你想从1月1日开始计算周数,并在周一更改周数,那么:
FLOOR((dt - TRUNC(TRUNC(dt, 'YY'), 'IW'))/7)+1
然后查询:
WITH sample_dates (dt) AS (
SELECT DATE '2021-12-30' + LEVEL - 1 FROM DUAL CONNECT BY LEVEL <= 40
)
SELECT dt,
TO_CHAR(dt, 'fmWW') AS week,
TO_CHAR(dt, 'fmIW') AS isoweek,
FLOOR((dt - TRUNC(dt, 'YY'))/7)+1 AS weekfromyearstart,
FLOOR((dt - TRUNC(TRUNC(dt, 'YY'), 'IW'))/7)+1 AS montosunweekfromyearstart
FROM sample_dates
输出:
DT 2022-01-24年 2021-12-30 2021-12-31 22022-01-02 22022-01-08 2022-01-09 22022-01-10 2022-011 2022-012 22022-01-13 22022-01-14 2022-015 3年 22022-01-18 3 2022-02-20 3年 4 4年 3年 4年 4年 4年 4年 4 4年 4年 5年 2022-01-30 2022-01-31 您使用的是isocalendar(),所以ISO周定义:所以每周都有一个数字(应该与年份一起使用):在这种情况下,您仍然处于2021的最后一周。
我找不到一个简单的解决方案,但你可以使用这个丑陋的技巧:
this_date = datetime.date(2022,1,1) week = int(this_date.strftime("%W")) + int(this_date.weekday() != 0)
工作原理:python有三周的定义:
%U:一年中的周数(星期日是一周的第一天),用零填充的十进制数表示。新年中第一个星期日之前的所有日子都被视为在第0周。
%W:一年中的周数(星期一为一周的第一天),用零填充小数。新年中第一个星期一之前的所有日子都被视为在第0周。
%V:ISO 8601周,以十进制数表示,星期一为一周的第一天。第01周是包含1月4日的一周。
%W
似乎是一个不错的候选者,但它从0开始,直到第一个星期一。所以我们可以添加
+1
,但当一年的第一天是星期一时,它就会失败。第二部分只是周一的测试。请记住,布尔值的整数对于False
为0,对于True
为1。您可能更喜欢使用if else
运算符。如果您喜欢从周日开始计算周数,只需将
%W
替换为%U
即可。