将 table 更新为带月份的日期
update table with dates with month
有个table dates_calendar
:
id | date
-------------------------
13 | 2016-10-23 00:00:00
14 | 2016-10-24 00:00:00
我需要更新此 table 并插入从 table 中的最后日期算起的下个月的日期。例如。最后日期是 2016-10-24 00:00:00
- 我需要插入 2016-10-31
之前的日期。在那之后(现在的最后一个日期是 2016-10-31
)下一个语句调用应该插入直到 2016-11-30
的日期,依此类推。
我的 SQL 代码示例,但它始终插入 30 天。
INSERT INTO dates_calendar (date)
VALUES (
generate_series(
(SELECT date FROM dates_calendar ORDER BY date DESC LIMIT 1) + interval '1 day',
(SELECT date FROM dates_calendar ORDER BY date DESC LIMIT 1) + interval '1 month',
'1 day'
)
);
我正在使用 PostgreSQL。也可以删除最后日期的重复 SELECT 语句。
要计算您需要插入的第一个和最后一个日期,您可以使用此查询:
select max(date) + interval '1' day as first_day,
date_trunc('month', max(date) + interval '1' month) - interval '1' day as last_day
from dates_calendar
表达式 date_trunc('month', max(date) + interval '1' month)
计算 下 月的开始日期。从中减去一天将得到该月的最后一天。
这可以用来生成日期列表:
with from_to (first_day, last_day) as (
select max(date) + interval '1' day,
date_trunc('month', max(date) + interval '1' month) - interval '1' day
from dates_calendar
)
select dt
from generate_series( (select first_day from from_to), (select last_day from from_to), interval '1' day) as t(dt);
最后,这可用于将生成的行插入 table:
with from_to (first_day, last_day) as (
select max(date) + interval '1' day,
date_trunc('month', max(date) + interval '1' month) - interval '1' day
from dates_calendar
)
insert into dates_calendar (date)
select dt
from generate_series( (select first_day from from_to), (select last_day from from_to), interval '1' day) as t(dt);
with max_date (d) as (select max(date)::date from dates_calendar)
insert into dates_calendar (date)
select d
from generate_series (
(select d from max_date) + 1,
(select date_trunc('month', d + interval '1 month')::date - 1 from max_date),
'1 day'
) g(d)
insert into dates_calendar (date)
select dates::date
from (
select max(date)::date+ 1 next_day, '1day'::interval one_day, '1month'::interval one_month
from dates_calendar
) s,
generate_series(
next_day,
date_trunc('month', next_day)+ one_month- one_day,
one_day) dates;
有个table dates_calendar
:
id | date
-------------------------
13 | 2016-10-23 00:00:00
14 | 2016-10-24 00:00:00
我需要更新此 table 并插入从 table 中的最后日期算起的下个月的日期。例如。最后日期是 2016-10-24 00:00:00
- 我需要插入 2016-10-31
之前的日期。在那之后(现在的最后一个日期是 2016-10-31
)下一个语句调用应该插入直到 2016-11-30
的日期,依此类推。
我的 SQL 代码示例,但它始终插入 30 天。
INSERT INTO dates_calendar (date)
VALUES (
generate_series(
(SELECT date FROM dates_calendar ORDER BY date DESC LIMIT 1) + interval '1 day',
(SELECT date FROM dates_calendar ORDER BY date DESC LIMIT 1) + interval '1 month',
'1 day'
)
);
我正在使用 PostgreSQL。也可以删除最后日期的重复 SELECT 语句。
要计算您需要插入的第一个和最后一个日期,您可以使用此查询:
select max(date) + interval '1' day as first_day,
date_trunc('month', max(date) + interval '1' month) - interval '1' day as last_day
from dates_calendar
表达式 date_trunc('month', max(date) + interval '1' month)
计算 下 月的开始日期。从中减去一天将得到该月的最后一天。
这可以用来生成日期列表:
with from_to (first_day, last_day) as (
select max(date) + interval '1' day,
date_trunc('month', max(date) + interval '1' month) - interval '1' day
from dates_calendar
)
select dt
from generate_series( (select first_day from from_to), (select last_day from from_to), interval '1' day) as t(dt);
最后,这可用于将生成的行插入 table:
with from_to (first_day, last_day) as (
select max(date) + interval '1' day,
date_trunc('month', max(date) + interval '1' month) - interval '1' day
from dates_calendar
)
insert into dates_calendar (date)
select dt
from generate_series( (select first_day from from_to), (select last_day from from_to), interval '1' day) as t(dt);
with max_date (d) as (select max(date)::date from dates_calendar)
insert into dates_calendar (date)
select d
from generate_series (
(select d from max_date) + 1,
(select date_trunc('month', d + interval '1 month')::date - 1 from max_date),
'1 day'
) g(d)
insert into dates_calendar (date)
select dates::date
from (
select max(date)::date+ 1 next_day, '1day'::interval one_day, '1month'::interval one_month
from dates_calendar
) s,
generate_series(
next_day,
date_trunc('month', next_day)+ one_month- one_day,
one_day) dates;