如何从PostgreSQL日期中提取每月的星期

时间:2018-08-07 14:01:33

标签: sql postgresql

我想从日期类型中提取一个月内一周内的数字(一年中不提供)。

示例:今天的日期是2018年7月8日。我不想32作为结果(一年中的一周),而是2,因为今天是八月的第二周。

我希望有类似的东西

SELECT EXTRACT($func FROM current_date);

结果:2

每月的第一周从该月的第一天持续到第一个星期日(第一周的持续时间可能是1到7天,例如本月,第一周从星期三1/8开始持续/ 2018年至5月5日(星期日),为期5天)。

添加本月的日历可为用户提供更多背景信息:

enter image description here

3 个答案:

答案 0 :(得分:0)

尝试提取日期,然后除以7:

SELECT
    1 + FLOOR((EXTRACT(DAY FROM date_col) - 1) / 7) AS week_of_month
FROM your_table;

Demo

答案 1 :(得分:0)

另一种选择是使用TO_CHAR(),如下所示:

SELECT TO_CHAR( CURRENT_DATE, 'W' )::integer

但是它也返回1,因为它从该月的第一天起算是几周...(因此不是从星期一或星期日开始)。

答案 2 :(得分:0)

您每月的是业务数据。通常,业务数据属于表。

表中的数据比复杂的日期算法更易于审核。 (在此处查看答案中所有不正确的日期算术。)使用表中的数据实现任意逻辑更为简单。同样,它也更容易理解和排除故障。

create table my_calendar (
  cal_date date primary key, 
  cal_year integer not null 
    check (cal_year = extract (year from cal_date)),
  cal_month integer not null 
    check (cal_month = extract (month from cal_date)),
  cal_week integer not null 
    check (cal_week between 1 and 5)
);

我包括了年和​​月(cal_year和cal_month),因为这是每个人似乎都需要的下一件事。

一些入门数据。

insert into my_calendar values
('2018-08-01',  2018, 8, 1),
('2018-08-02',  2018, 8, 1),
('2018-08-03',  2018, 8, 1),
('2018-08-04',  2018, 8, 1),
('2018-08-05',  2018, 8, 1),
('2018-08-06',  2018, 8, 2),
('2018-08-07',  2018, 8, 2),
('2018-08-08',  2018, 8, 2),
('2018-08-09',  2018, 8, 2),
('2018-08-10',  2018, 8, 2),
('2018-08-11',  2018, 8, 2),
('2018-08-12',  2018, 8, 2),
('2018-08-13',  2018, 8, 3),
('2018-08-14',  2018, 8, 3),
('2018-08-15',  2018, 8, 3);

还有一个查询来验证逻辑。

select cal_date
from my_calendar
where cal_year = 2018 
  and cal_month = 8 
  and cal_week = 1
order by cal_date;

cal_date
date
--
2018-08-01
2018-08-02
2018-08-03
2018-08-04
2018-08-05

仔细控制这种表中的特权。您可能希望每个人都可以阅读它,但是几乎没有人应该可以写它。