Как преобразовать следующий еженедельный формат даты в SQL: (например, 2015-W34) - PullRequest
0 голосов
/ 26 апреля 2020

Я скачал набор данных с ECD C, в котором есть еженедельные записи в следующем формате даты: «2015-W34». У меня есть файл в базе данных SQL, и я пытаюсь преобразовать дату в любой обычный формат даты, например, гггг / мм / дд.

Год начинается в W01 и заканчивается в W52 или W53. Например, 2017 год варьируется от: 2017-W01 до 2017-W52.

Любая помощь приветствуется!

Я использую IBM Db2 в облаке и обращаюсь к ней через лаборатории Jupyter, пишу в Python 3.

Ответы [ 2 ]

0 голосов
/ 27 апреля 2020

Рассмотрим следующее утверждение и его результат:

WITH T(N, DT) AS 
(
VALUES (1, DATE('2014-12-29'))
  UNION ALL
SELECT N + 1, DT + 1
FROM T
WHERE N < 8
)
SELECT DT, WEEK_ISO(DT) WEEK_ISO, WEEK(DT) WEEK, DAYNAME(DT) DAYNAME FROM T;

Результат:

|DT        |WEEK_ISO   |WEEK       |DAYNAME   |
|----------|-----------|-----------|----------|
|2014-12-29|1          |53         |Monday    |
|2014-12-30|1          |53         |Tuesday   |
|2014-12-31|1          |53         |Wednesday |
|2015-01-01|1          |1          |Thursday  |
|2015-01-02|1          |1          |Friday    |
|2015-01-03|1          |1          |Saturday  |
|2015-01-04|1          |2          |Sunday    |
|2015-01-05|2          |2          |Monday    |

Это демонстрация того факта, что связь между YYYY-MM-DD и Формат YYYY-W не 1:1, а N:1.
Это означает, что существует ряд дат, соответствующих формату 2015-W01, и это зависит от значения W.
WEEK
WEEK_ISO

Таким образом, невозможно отобразить дату YYYY-W (которая фактически является не датой, а ссылкой на неделю) на YYYY-MM-DD однозначно . Вы должны предоставить точное формальное описание точной даты, к которой должно быть выполнено такое сопоставление.

Например, такое описание может быть следующим:

Мы сопоставляем такую ​​неделю YYYY-WXX с дата, которую мы получаем как YYYY-01-01 + (XX-1) недель.
Реализация этого алгоритма:

WITH PARMS (STR) AS 
(
VALUES
  '2015-W34'
, '2017-W01'
, '2017-W52'
)
SELECT 
  STR
, DATE(SUBSTR(STR, 1, 4) || '-01-01') + (INT(SUBSTR(STR, 7)) - 1) * 7 DT
FROM PARMS;

Результат:

|STR     |DT        |
|--------|----------|
|2015-W34|2015-08-20|
|2017-W01|2017-01-01|
|2017-W52|2017-12-24|
0 голосов
/ 26 апреля 2020

Предположительно, это в формате ISO. Вы можете получить год ISO, используя logi c, например:

date_trunc('week', current_date) - 7 * (week_iso(current_date) - 1) day

. Вы можете применить это к своему выражению:

date_trunc('week', date(left(yyyyww, 4) || '02-01')) - 7 * (week_iso(date(left(yyyyww, 4) || '02-01')) - 1) day

Затем вы можете добавить недели назад:

date_trunc('week', date(left(yyyyww, 4) || '02-01')) - 7 * (week_iso(date(left(yyyyww, 4) || '02-01')) - 1) day + (cast(right(yyyyww, 2) as int) - 1) * 7 day
...