2017-07-18 16 views
0

1230の最後の週からからYYYYWWまでの日付で日付を毎日変換する必要があります。YYWWのフォーマットに自動化する

#standardSQL 
WITH Input AS (
    SELECT date 
    FROM UNNEST([ 
    DATE '2016-12-26', 
    DATE '2016-12-27', 
    DATE '2016-12-28', 
    DATE '2016-12-29', 
    DATE '2016-12-30', 
    DATE '2016-12-31', 
    DATE '2017-01-01']) AS date 
) 

SELECT 
    date, 
    CAST(FORMAT_DATE('%Y%V', CAST(date AS DATE)) AS STRING) AS YearWeek, 
    CAST(FORMAT_DATE('%Y', CAST(date AS DATE)) AS STRING) AS Year, 
    CAST(FORMAT_DATE('%V', CAST(date AS DATE)) AS STRING) AS 
FROM Input 
ORDER BY date 

すべてのそれは2017-01-01に到達するまで、OK:

Row date YearWeek Year Week  
1 2016-12-26 201652 2016 52 
2 2016-12-27 201652 2016 52 
3 2016-12-28 201652 2016 52 
4 2016-12-29 201652 2016 52 
5 2016-12-30 201652 2016 52 
6 2016-12-31 201652 2016 52 
7 2017-01-01 201752 2017 52 

'201752' は '201652' でなければなりません。

歴史的な日付の自動化に最適な方法はありますか?このような

何か:

IF (REGEXP_EXTRACT(date,r'\d{4}-\d{2}-(\d{2})') = CAST('01' AS STRING) 
    AND Week = CAST('52' AS STRING), Year-1, Year) 

答えて

1

も注意BigQueryの標準SQL

#standardSQL 
WITH Input AS (
    SELECT DATE 
    FROM UNNEST([ 
    DATE '2016-12-26', 
    DATE '2016-12-27', 
    DATE '2016-12-28', 
    DATE '2016-12-29', 
    DATE '2016-12-30', 
    DATE '2016-12-31', 
    DATE '2017-01-01']) AS date 
) 
SELECT 
    date, 
    FORMAT_DATE('%G%V', date) AS YearWeek 
FROM Input 
ORDER BY date 

のためである - あなたの例では:
1.あなたはdateとしてCAST(date AS DATE)する必要はありませんあなたドン
2. Date型のすでにありますCAST(FORMAT_DATE(...) AS STRING)としてFORMAT_DATEが既に返されていますSTRING

1

%Yは、日付ではなく、ISOの年暦年戻ります。 2017年1月1日のISO年間(2016年)を返すには、代わりに%Gを使用します。 Supported Format Elements for DATEも参照してください。以下は

関連する問題