Стандартное функционирование даты 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