2017-01-17 4 views
0

Я могу создать user defined function и вычислить общее количество дней для данного месяца. Существует ли прямой способ получить общее количество дней в данном месяце за данную датуПолучите общее количество дней в данном месяце в Google BigQuery?

например.

select date_t, some_inbuilt_function_get_total_no_of_days_in_month(date_t) 

Существует месяц функция получить месяц от заданной даты, так же есть функция даты, так что я могу перейти на начало месяца. Существует функция разницы дат, но нет конца до конца месяца.

Ссылка: https://cloud.google.com/bigquery/docs/reference/legacy-sql

+0

примечание стороны - думать о переходе от унаследованного SQL и на стандартной SQL в BigQuery. –

ответ

2

Это может быть дело эстетического предпочтения, но ниже выглядит более элегантно мне

#standardSQL 
CREATE TEMP FUNCTION DaysInMonth(d DATE) AS (
    32 - EXTRACT(DAY FROM DATE_ADD(DATE_TRUNC(d, MONTH), INTERVAL 31 DAY)) 
); 

SELECT DaysInMonth('2017-01-17'); 

И как-то я чувствую, будет более оптимальным на большом объеме (если есть вариант использования для этого)

Ниже еще один вариант - менее оптимальный

#standardSQL 
CREATE TEMP FUNCTION DaysInMonth(d DATE) AS (
    EXTRACT(DAY FROM DATE_SUB(DATE_ADD(d, INTERVAL 1 MONTH), 
          INTERVAL EXTRACT(DAY FROM d) DAY)) 
); 

SELECT DaysInMonth('2017-01-17') 

И если по какой-либо причине вам нужно это в BigQuery Наследство SQL, проверьте ниже примера (но по-прежнему считает migrating to Standard SQL)

#legacySQL 
SELECT 
    32 - DAY(DATE_ADD(UTC_USEC_TO_MONTH(PARSE_UTC_USEC(d)),31,'DAY')) as DaysInMonth 
FROM (SELECT '2017-01-17' as d) 
+1

было бы здорово, если бы у SO была возможность каким-то образом сделать комментарии для downvotes. в противном случае выглядит неясно, почему «правильный ответ» был опущен: o (- очень редко, но я вижу, что это происходит здесь –

0

Я нашел один путь к концу месяца,

Мы можем использовать функцию ДАТА ADD, чтобы перейти к следующему месяцу, а затем вычесть 1 день, чтобы перейти к концу месяца ,

SELECT 
    DATE_ADD(TIMESTAMP(CONCAT(STRING(YEAR(DATE_ADD(TIMESTAMP("2017-1-12"),1, "Month"))),"-",STRING(MONTH(DATE_ADD(TIMESTAMP("2017-1-12"),1, "Month"))),"-1")), -1, "DAY") 

Вот ответ: Просто замените 2017-1-12 с желаемой даты

SELECT 
    DATEDIFF(TIMESTAMP(CONCAT(STRING(YEAR(DATE_ADD(TIMESTAMP("2017-1-12"),1, "Month"))),"-",STRING(MONTH(DATE_ADD(TIMESTAMP("2017-1-12"),1, "Month"))),"-1")), 
    TIMESTAMP(CONCAT(STRING(YEAR(TIMESTAMP("2017-1-12"))),"-",STRING(MONTH(TIMESTAMP("2017-1-12"))), "-1"))) 
+0

Как отметил Эллиот, это намного проще и чище с использованием стандартного SQL. –

3

Это проще с помощью standard SQL. Вы также можете определить свою собственную функцию, чтобы упростить свой запрос.

#standardSQL 
CREATE TEMP FUNCTION DaysInMonth(d DATE) AS (
    DATE_DIFF(DATE_TRUNC(DATE_ADD(d, INTERVAL 1 MONTH), MONTH), 
      DATE_TRUNC(d, MONTH), DAY) 
); 

SELECT DaysInMonth('2017-01-17'); 
Смежные вопросы