首页 > 解决方案 > 如何在没有 to_char 的情况下将日期转换为 YYYY-MM

问题描述

我需要 1. 将日期转换为 yyyy-mm 格式,以及 2. 从 start_date 和 end_date 计算月份的持续时间,例如持续时间 = 1 个月,...等。start_date & end_date 是 PostgreSQL 中的日期字符串。我可以以天为单位计算持续时间并将日期转换为 yyyy-mm 格式。

to_char(TO_DATE(end_payperiod_date,'MM/DD/YY'), 'YYYY-MM')

对于月份持续时间计算,我发现 to_date() 无法在 PostgreSQL 中转换为 yyyy-mm 格式。to_char() 可以显示 yyyy-mm,但我不能进行计算。

有什么办法可以将日期转换为 yyyy-mm 进行计算?

标签: sqlpostgresql

解决方案


你的要求不清楚。PostgreSQL 很容易处理日期和日期算术。但是像“2019-12”这样的值不是日期。我将拼凑一张小桌子来演示这些问题。

create table test (
  start_date char(10) not null,
  end_date  char(10) not null,
  check (start_date <= end_date)
);

insert into test values 
('2019-12-01', '2020-01-01'), 
('2019-12-31', '2020-01-01'),
('2019-12-01', '2020-01-31'),
('2019-01-31', '2019-03-01');

PostgreSQL 可以从另一个日期中减去一个日期,但您没有日期。你有字符串。因此,将 char 或 varchar 列转换为日期,并取其差异。如果您的数据库已经存在了一段时间,那么这些列中的值很可能无法转换为有效日期。

select 
  cast (start_date as date), 
  cast(end_date as date), 
  cast(end_date as date) - cast(start_date as date) as difference,
  left(start_date, 7) as start_month,
  left(end_date, 7) as end_month
from test;
start_date end_date 差异 start_month end_month
--
2019-12-01 2020-01-01 31 2019-12 2020-01
2019-12-31 2020-01-01 1 2019-12 2020-01
2019-12-01 2020-01-31 61 2019-12 2020-01
2019-01-31 2019-03-01 29 2019-01 2019-03

请注意,start_month 和 end_month 是相同的,start_month = '2019-12'尽管差异范围从 1 天到 61 天不等。你想如何计算一月和三月之间的差异仍然不清楚。

将您注释中的查询调整为此处给出的表和列名称并没有返回您似乎期望的结果。


推荐阅读