我想从日期类型中提取一个月内一周内的数字(一年中不提供)。
示例:今天的日期是2018年7月8日。我不想32
作为结果(一年中的一周),而是2
,因为今天是八月的第二周。
我希望有类似的东西
SELECT EXTRACT($func FROM current_date);
结果:2
每月的第一周从该月的第一天持续到第一个星期日(第一周的持续时间可能是1到7天,例如本月,第一周从星期三1/8开始持续/ 2018年至5月5日(星期日),为期5天)。
添加本月的日历可为用户提供更多背景信息:
答案 0 :(得分:0)
尝试提取日期,然后除以7:
SELECT
1 + FLOOR((EXTRACT(DAY FROM date_col) - 1) / 7) AS week_of_month
FROM your_table;
答案 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
仔细控制这种表中的特权。您可能希望每个人都可以阅读它,但是几乎没有人应该可以写它。