在 postgres 中复制 MySQL yearweek 函数

Replicate MySQL yearweek function in postgres

正在将项目从使用 MySQL 转换为 postgres,但无法弄清楚如何复制 MySQL 的 yearweek 函数。

例如 MySQL 中的以下内容:

select CAST(yearweek(user.created_at) AS CHAR CHARACTER SET utf8) as yrwk, user.created_at

returns:

"201452"    "2014-12-31 00:00:00"   "1"
"201601"    "2016-01-05 00:00:00"   "60"
"201601"    "2016-01-09 00:00:00"   "47"
"201623"    "2016-06-08 14:40:37"   "69"

如何使用 postgres 获得相同的结果?我已经尝试对 YEAR 和 WEEK 使用 EXTRACT 函数,然后将它们连接起来,但是 postgres 有时会 return 53 对于年初的日期,这会使一切都乱七八糟。

您可以使用具有适当格式字符串的函数 TO_CHAR

要准确复制 YEARDATE 的行为,必须将日期截断到包含周的开始。

SELECT TO_CHAR(DATE_TRUNC('week', NOW()), 'YYYYWW')
-- outputs:
201826

并且,使用您的示例日期:

WITH dates(dt) AS (
VALUES 
('2014-12-31 00:00:00'::timestamp),
('2016-01-05 00:00:00'::timestamp),
('2016-01-09 00:00:00'::timestamp),
('2016-06-08 14:40:37'::timestamp)
)
SELECT dt, TO_CHAR(DATE_TRUNC('week', dt), 'YYYYWW') yrwk
FROM dates;
-- outputs:
         dt          |  yrwk
---------------------+--------
 2014-12-31 00:00:00 | 201452
 2016-01-05 00:00:00 | 201601
 2016-01-09 00:00:00 | 201601
 2016-06-08 14:40:37 | 201623