Реплицировать функцию MySQL yearweek в postgres - PullRequest
0 голосов
/ 28 июня 2018

Преобразование проекта из MySQL в postgres и не может понять, как реплицировать функцию MySQL yearweek.

Например, следующее в MySQL:

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

возвращается:

"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? Я пытался использовать функцию EXTRACT как для YEAR, так и для WEEK, а затем объединять их, но postgres будет иногда возвращать 53 для дат в начале года, что выбрасывает все из строя.

1 Ответ

0 голосов
/ 28 июня 2018

Вы можете использовать функцию 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
...