BigQuery Standard SQL возвращает различную неделю из метки времени - PullRequest
0 голосов
/ 10 ноября 2018

Я преобразовываю старый запрос из устаревшего SQL в стандартный SQL и заметил, что мой отчет отключен. Я проследил это до устаревшего SQL и стандартного SQL, возвращая разные недели на основе отметки времени в миллисекундах UNIX.

У меня сложилось впечатление, что устаревший SQL-запрос был правильным, но мне любопытно узнать разницу. Это не за все недели, но достаточно, чтобы значительно скинуть мой отчет.

Вот пример:

#legacySQL
SELECT WEEK(MSEC_TO_TIMESTAMP(1470631859000)) AS sign_up_week;

Выход: 33

#standardSQL
SELECT EXTRACT(WEEK FROM TIMESTAMP_MILLIS(1470631859000));

Выход: 32

Я просмотрел следующую документацию по устаревшей ссылке на SQL:

WEEK(<timestamp>)
Returns the week of a TIMESTAMP data type as an integer between 1 and 53, inclusively.

Weeks begin on Sunday, so if January 1 is on a day other than Sunday, week 1 has fewer than 7 days and the first Sunday of the year is the first day of week 2.

А из ссылки на стандартный SQL:

WEEK(<WEEKDAY>): Returns the week number of the date in the range [0, 53]. Weeks begin on WEEKDAY. Dates prior to the first WEEKDAY of the year are in week 0. Valid values for WEEKDAY are SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, and SATURDAY.

ISOWEEK: Returns the ISO 8601 week number of the date_expression. ISOWEEKs begin on Monday. Return values are in the range [1, 53]. The first ISOWEEK of each ISO year begins on the Monday before the first Thursday of the Gregorian calendar year.

Как получить стандартный запрос SQL для вывода того же номера недели, что и для устаревшего запроса SQL? Если нет, какой номер недели правильный? Похоже, я не могу заставить их ласточкин хвост изначально.

1 Ответ

0 голосов
/ 10 ноября 2018

Это немного неуловимо, но устаревший и стандартный SQL обрабатывает недели по-разному. В устаревшем SQL :

Недели начинаются в воскресенье, поэтому, если 1 января приходится на день, отличный от воскресенья, на неделе 1 меньше 7 дней, а первое воскресенье года - это первый день недели 2.

В стандартном SQL:

  • WEEK: Возвращает номер недели даты в диапазоне [0, 53]. Недели начинаются с воскресенья, а даты до первого воскресенья года - на неделе 0.

Итак, в устаревшем SQL первое воскресенье - неделя 2. В стандартном SQL первое воскресенье - неделя 1.

...