在 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
正在将项目从使用 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