Рассмотрим следующее утверждение и его результат:
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|