在Google BigQuery中获取给定月份的总天数?

Pra*_*eep 1 google-bigquery

我可以创建用户定义的函数并计算给定月份的总天数.是否有直接的方法在给定日期内在给定月份内没有天数

例如.

select date_t, some_inbuilt_function_get_total_no_of_days_in_month(date_t)
Run Code Online (Sandbox Code Playgroud)

从给定日期开始有月份功能,同样有日期功能,所以我可以去月初.有日期差异功能,但没有办法到月底.

参考:https://cloud.google.com/bigquery/docs/reference/legacy-sql

Isl*_*zab 12

一个更简单的方法就是

EXTRACT(DAY FROM LAST_DAY(<DATE>))
Run Code Online (Sandbox Code Playgroud)

作为一个函数

CREATE TEMP FUNCTION DaysInMonth(d DATE) AS (
  EXTRACT(DAY FROM LAST_DAY(d))
);

SELECT DaysInMonth('2017-01-17');  
Run Code Online (Sandbox Code Playgroud)


Mik*_*ant 5

这可能是审美偏好的问题,但下面看起来更优雅

#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');  
Run Code Online (Sandbox Code Playgroud)

不知何故,我觉得在大容量上会更优化(如果有任何用例)

下面是另一个版本 - 不太理想

#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')  
Run Code Online (Sandbox Code Playgroud)

如果出于任何原因需要在BigQuery Legacy SQL中使用它,请查看以下示例(但仍考虑迁移到标准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)
Run Code Online (Sandbox Code Playgroud)