【问题标题】:Getting the right week number of year获得正确的年份周数
【发布时间】:2013-02-11 16:03:05
【问题描述】:

我想获得正确的周数。

使用to_char 函数,该函数枚举从星期一开始的星期,但考虑到星期从星期六开始,我想获得星期数。

这是一个例子:

SELECT to_char('05-01-2013'::date,'daydd-mm-yyyy') as date_char, to_char('05-01-2013'::date,'IW') as week_number

结果:

"saturday 05-01-2013";"01"   

应该是:

"saturday 05-01-2013";"02"  

有什么方法可以得到吗?

配置信息:Windows 7 下的 Postgresql 9.2

【问题讨论】:

  • 我不明白你的问题。您给出的选择与您给出的结果不匹配。 'SELECT to_char('05-01-2013'::date,'daydd-mm-yyyy') as date_char, to_char('05-01-2013'::date,'IW') as week_number;'会给你:'wednesday01-05-2013';'18'。你希望它给你什么结果?
  • 为什么是星期三? 05-01-2013 是星期六!我正在寻找告诉 postgresql 一周从周六到周五开始,而不是从周一到周日。
  • 2013 年 5 月 1 日将是一个星期三。如果我剪切/粘贴您的查询,我会得到我发布的结果。我认为这里可能存在语言环境问题。我认为你应该澄清你正在使用什么语言环境,以及你得到了什么以及你期望什么。
  • 好的,05-01-2013 的格式为 dd-mm-year;即:2013 年 1 月 1 日
  • 对不起,即:2013 年 1 月 5 日

标签: postgresql date week-number


【解决方案1】:

SELECT EXTRACT(WEEK FROM now()); 将给出数字 7,表示(目前)我们处于一年中的第 7 周。 默认情况下,Postgres 周从星期一开始。

SELECT EXTRACT(WEEK FROM timestamp '2013-01-05'); 将给出 1,因为自年初以来仅过去了 5 天。

编辑它似乎只从第一个整周过去的时间开始计算周数。在不编写您自己的函数的情况下,我建议您使用它或使用其他方法来查找它。

【讨论】:

  • 是的,我想知道应该没有准备好使用功能,或者需要配置的东西。该死的
【解决方案2】:

您必须使用 extract(doy from ...)extract(dow from ...) 以及一些数学运算。详情见documentation

【讨论】:

  • 我不是在寻找星期几,而是一年中的星期数
  • 而周数应该考虑从星期六到星期五开始的一周。
  • 我应该写函数来实现这个吗?
  • 你可以。这将是一个非常简单的 SQL 函数,并且会简化进一步的查询。或者更准确地说 - 使其更具可读性。
【解决方案3】:

这将给出正确的结果:

with first_friday as (
    select extract(doy from min(a)::date) ff
    from generate_series('2013-01-01'::date, '2013-01-07', '1 day') s(a)
    where extract(dow from a) = 5
)
select
    to_char(a, 'day'),
    a::date "day",
    floor((extract(doy from a) - (select ff from first_friday) - 1) / 7) + 2 week_number
from generate_series('2013-01-01'::date, '2013-01-31', '1 day') s(a)
;
  to_char  |    day     | week_number 
-----------+------------+-------------
 tuesday   | 2013-01-01 |           1
 wednesday | 2013-01-02 |           1
 thursday  | 2013-01-03 |           1
 friday    | 2013-01-04 |           1
 saturday  | 2013-01-05 |           2
 sunday    | 2013-01-06 |           2
 monday    | 2013-01-07 |           2
 tuesday   | 2013-01-08 |           2
 wednesday | 2013-01-09 |           2
 thursday  | 2013-01-10 |           2
 friday    | 2013-01-11 |           2
 saturday  | 2013-01-12 |           3
 sunday    | 2013-01-13 |           3
 monday    | 2013-01-14 |           3
 tuesday   | 2013-01-15 |           3
 wednesday | 2013-01-16 |           3
 thursday  | 2013-01-17 |           3
 friday    | 2013-01-18 |           3
 saturday  | 2013-01-19 |           4
 sunday    | 2013-01-20 |           4
 monday    | 2013-01-21 |           4
 tuesday   | 2013-01-22 |           4
 wednesday | 2013-01-23 |           4
 thursday  | 2013-01-24 |           4
 friday    | 2013-01-25 |           4
 saturday  | 2013-01-26 |           5
 sunday    | 2013-01-27 |           5
 monday    | 2013-01-28 |           5
 tuesday   | 2013-01-29 |           5
 wednesday | 2013-01-30 |           5
 thursday  | 2013-01-31 |           5

【讨论】:

  • 不,没那么简单,因为 29-12-2012 到 31-12-2012 应该是 53,而不是 01。
  • @Houari 你的意思是一年的第一天应该总是在第一周?您是否知道第一周应包括 1 月 4 日的 ISO 定义,因此有时第一天将在第 53 周?您应该清楚地说明您对周年的定义是什么。
  • 是的,一年的第一天应该总是在第 1 周。
  • 第一周从一年的第一天开始,新年的第一个星期五在第一周。
  • 是的!这正是我想要的,但仅限于 2013 年,是否有可能适用于所有日期?
猜你喜欢
  • 1970-01-01
  • 2017-09-19
  • 1970-01-01
  • 2016-03-21
  • 1970-01-01
  • 2021-09-14
  • 1970-01-01
  • 2021-04-11
  • 1970-01-01
相关资源
最近更新 更多