sql - 如何在没有 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 进行计算?
解决方案
你的要求不清楚。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 天不等。你想如何计算一月和三月之间的差异仍然不清楚。
将您注释中的查询调整为此处给出的表和列名称并没有返回您似乎期望的结果。
推荐阅读
- javascript - 如何禁用列表项?
- kotlin - 为什么我的 FloatingActionButton 在 Kotlin 中的 Fragment 上不起作用?
- oracle - Oracle 中的 NOPARALLEL 和 PARALLEL 1 有什么区别?
- python - Python:获取请求 Instagram API 不起作用
- c++ - 在 Boost Program Options 中,如何判断是否指定了默认选项?
- amazon-web-services - 为什么 CloudFront 有时会在启用 gzip 而不是 br 时提供 gzip?
- javascript - 如何在空闲 Chrome 选项卡中使用强化节流运行 Javascript 计时器
- android - 由于 Hockey SDK 不再存在于代码中,Google 暂停了应用程序
- flutter - Flutter - google_mobile_ads 支持 facebook 受众网络中介与 admob?
- sql - 在同一行上显示分组行中的单个元素