Стандартное функционирование даты SQL

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

Мой текущий унаследованный SQL-запрос приведен ниже:

legacySQL

select
date,
round(sum(revenue_total),2) as revenue
from [project:dataset.table]
where month(date) = month(date_add(current_date(),-1,'month'))
group by 1

Как бы я преобразовал оператор where в стандартный запрос SQL?

4 ответа

Вы, вероятно, хотите:

WHERE DATE_TRUNC(date, MONTH) = DATE_TRUNC(CURRENT_DATE(), MONTH)

Я подозреваю, что ваш date столбец на самом деле имеет тип TIMESTAMP, в этом случае вам нужно преобразовать в DATE первый:

WHERE DATE_TRUNC(EXTRACT(DATE FROM date), MONTH) = DATE_TRUNC(CURRENT_DATE(), MONTH)

Обратите внимание, что EXTRACT функция имеет необязательный AT TIME ZONE предложение, которое позволяет вам указать часовой пояс, если вы не хотите использовать значение по умолчанию, то есть UTC. См. Документацию по функции отметки времени для получения дополнительной информации.

Следуйте примеру, используя публичный репозиторий GitHub:

SELECT
  CAST(committer.date AS DATE),
  COUNT(*)
FROM
  `bigquery-public-data.github_repos.commits`
WHERE
  EXTRACT(MONTH FROM CAST(committer.date AS DATE)) = EXTRACT(MONTH FROM (DATE_SUB(CURRENT_DATE(), INTERVAL 1 MONTH)))

GROUP BY
  1
LIMIT
  10

Относительно функций даты под рукой есть эквивалентные функции в стандартном SQL BG

  • МЕСЯЦ () -> ЭКСТРАКТ (): EXTRACT(part FROM date_expression)например,

    EXTRACT(MONTH FROM date)
    
  • date_add() а также current_date() все еще доступны.

Я предполагаю, что вы действительно хотите:

where date_trunc(date, 'month') = date_add(date_trunc(current_date), interval -1 month)

Однако то, что вы написали, не учитывает год, так что это будет:

where extract(month from date) = extract(month from current_date) - 1
Другие вопросы по тегам