Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在postgresql中获得一个月的周数_Sql_Postgresql_Date - Fatal编程技术网

如何在postgresql中获得一个月的周数

如何在postgresql中获得一个月的周数,sql,postgresql,date,Sql,Postgresql,Date,使用下面的查询,我可以得到当前的一周 select extract(week from current_timestamp) 我想知道一个月我们有多少周的时间。我不相信这会是您的最终解决方案,但它可能会有所帮助 使用了TO_NUMBER函数,因此我们可以在外部选择中添加数字,而TO_char函数的结果不是数字:) 使用了TO_CHAR函数,因此我们可以从使用date_trunc函数“计算”的日期开始计算月份数。TO_CHAR函数的第一个月结果为05 DATE\u TRUNC函数与+interv

使用下面的查询,我可以得到当前的一周

select extract(week from current_timestamp)

我想知道一个月我们有多少周的时间。

我不相信这会是您的最终解决方案,但它可能会有所帮助

使用了TO_NUMBER函数,因此我们可以在外部选择中添加数字,而TO_char函数的结果不是数字:)

使用了TO_CHAR函数,因此我们可以从使用date_trunc函数“计算”的日期开始计算月份数。TO_CHAR函数的第一个月结果为05

DATE\u TRUNC
函数与
+interval“1个月-1天”
一起用于获取当前月份的第一天,然后使用此部分
+interval“1个月-1天”
我们以以下格式获取该月份的最后日期:
2020-01-31 00:00:00+00
。从该日期起,我们将使用to_char函数获得值
05
(周数)

我在这里为您计算了第一和第十二:

SELECT one "1st"
       , "12th" 
from (
select 
(to_number(to_char((date_trunc('month', CURRENT_DATE) + interval '1 month - 1 day'), 'IW'), '99')  
- to_number(to_char((date_trunc('month', CURRENT_DATE)), 'IW'), '99') +1) "one",
(to_number(to_char((date_trunc('month', CURRENT_DATE) + interval '12 month - 1 day'), 'IW'), '99')
- to_number(to_char((date_trunc('month', CURRENT_DATE) + interval '11 month'), 'IW'), '99') +1) "12th") table_alias

下面是一个

要知道与一个月重叠的周数,请尝试

SELECT date_part('week', date_trunc('month', current_timestamp) + INTERVAL '1 month' - INTERVAL '1 day')
     - date_part('week', date_trunc('month', current_timestamp))
     +1;
这将计算一个月内最后一天的一周与第一天的一周之间的差值,然后相加。一个


用您感兴趣的月份的时间戳替换
current\u timestamp

您最好只在日历上查找,并将结果存储在表中,以便代码以后可以查找。 首先要注意的是,如果考虑了部分周,那么OP不是要求“一个月有多少周”,而是要求“一个月有多少周”。虽然有细微的差别,但仍然有差别。 结果是所有月份都在5周或6周内,除了2月有4周或5周。 尽管@Laurenz Albe和@VBoke的尝试令人钦佩,但他们注定要遭受同样的致命伤;ISO-8601标准与公历之间的差异。该标准定义明确且一致。不幸的是,日历不符合该标准
该标准规定每周从周一开始,精确到7天,日历月份不太规则。此外,本标准仅识别一个重要日期-1月4日。该日期始终在一年的第一周。因此,1月1日的一周可能是前一年的第52/53周,12月的最后几天可能会进入下一年的第1周。这可能导致每周计算为负数。最后,至少现在是这样,从太阳开始的任何一个月,这个算法都会产生额外的一周。哦,还有二月。
使用Laurenz的作为基线示例:

    -- expanded to show Month Year, start and end week number and the number of weeks
    set timezone to 'UTC'; 
    with date_list (a_date) as (select generate_series('2019-12-01'::timestamptz,'2030-02-01'::timestamptz,interval '1 month')) 
    select to_char(a_date, 'Mon yyyy')
         , date_part('week', date_trunc('month', a_date) + INTERVAL '1 month' - INTERVAL '1 day') end_of_month_week
         , date_part('week', date_trunc('month', a_date))                                         start_of_month_week
         -- L actual
         , date_part('week', date_trunc('month', a_date) + INTERVAL '1 month' - INTERVAL '1 day')
           - date_part('week', date_trunc('month',a_date)) + 1                                    number_of_weeks_month_in    
              from date_list
    ; 
在大多数情况下似乎是正确的,但显然不是所有情况。考虑到上述情况,我修改了Laurenz的《除调整外的基本要素》。导致:

set timezone to 'UTC'; 
with date_list (a_date) as (select generate_series('2019-12-01'::timestamptz,'2030-02-01'::timestamptz,interval '1 month')) 
select a_date, start_of_month_week, end_of_month_week
     , case when start_of_month_week > end_of_month_week
            then case when date_part('month', a_date) = 1  
                      -- adjustment for Jan
                      then case when date_part('dow', a_date) = 0
                                then 5 else 6 end
                      -- adjustment for Dec
                      else case when date_part('dow',a_date) = 6
                                then 6 else 5 end
                      end
             when date_part('month',a_date) = 2
             -- and then there is Feb
                  then case when date_part('day', a_date+interval '1 month - 1 day') = 29
                            then 5

                            when date_part('dow', a_date) = 0
                            then 4 else 5
                        end   
             when date_part('dow', a_date) = 0
                  -- month beging on Sun
                  then end_of_month_week - start_of_month_week
            -- No adjustment needed Mar - Nov And Not 1st on Mon
            else end_of_month_week - start_of_month_week + 1
       end::integer  number_of_weeks_month_in
       , date_part('day', a_date+interval '1 month - 1 day') 
  from ( 
        SELECT a_date::date
             , date_part('week', date_trunc('month', a_date) + INTERVAL '1 month' - INTERVAL '1 day') end_of_month_week
             , date_part('week', date_trunc('month', a_date))                                         start_of_month_week
          from date_list
       ) dts  
      ;

免责声明:虽然我相信调整后的查询是正确的,但我没有每月进行调查并验证每个月或一周中其他可能需要对基本算法进行调整的日子。重复此操作可能更容易查找这些值并将其存储在表中

一个月内总有4个完整的星期。你还想知道什么?没有特别的日子吗?比如有多少个星期六或星期天?@AnkitBajpai不仅仅是整周,我们还想计算下个月的一两天是否属于本月的工作周。那么您的预期产出是多少?如果是分部,每年可能会有多达6周(见2022年1月)。但要下定决心,你需要定义一周。你没有这样做,所以你认为一个星期。嗨@ USER 85 45 255,将感谢你的反馈。谢谢