【问题标题】:How to convert date to YYYY-MM without to_char如何在没有 to_char 的情况下将日期转换为 YYYY-MM
【发布时间】:2019-09-28 18:11:22
【问题描述】:

我需要 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来计算?

【问题讨论】:

  • yyyy-mm 是什么意思。那是VARCHAR 类型还是数字类型?
  • end_payperiod_date 是什么数据类型?如果那已经是一个日期,那么在它上面调用to_date() 就是一个错误。
  • @a_horse_with_no_name 实际上 end_payperiod_date 是 PostgreSQL 中的字符串
  • 你到底为什么要将 DATE 存储为字符串?这是一个非常糟糕的主意。
  • @TheImpaler 数字进行计算。但是,如果它是整数,则不会进行日期计算。例如,如果我想获得 2019-12 和 2020-01 的月份持续时间,则预期月份持续时间为 1 个月。如果我转换为整数,它将产生例如89 为 12/31/2000-1/14/2001 cast(to_char(TO_DATE(end_payperiod_date,'MM/DD/YY'), 'YYYYMM') as integer) - cast(to_char(TO_DATE(begin_payperiod_date,'MM/DD/YY'), 'YYYYMM') as integer)

标签: sql postgresql


【解决方案1】:

您的要求不清楚。 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 = '2019-12' 的 start_month 和 end_month 相同,尽管差异范围为 1 到 61 天。而你想如何计算一月和三月之间的差异仍然不清楚。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-19
    • 2023-03-26
    相关资源
    最近更新 更多