2017-07-18 2 views
0

Je dois convertir la date par date tous les jours de la dernière semaine de 2016 au format YYYYWW.Automatisation des dates de conversion au format 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 

Tout OK, jusqu'à ce qu'il atteigne 2017-01-01:

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' devrait être '201652'.

La meilleure façon de l'automatiser pour les dates historiques?

Quelque chose comme ceci:

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

Répondre

1

ci-dessous est BigQuery standard 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 

également Remarque - dans votre exemple:
1. Vous ne devez CAST(date AS DATE) que date déjà de type DATE
2. Vous n pas besoin CAST(FORMAT_DATE(...) AS STRING) comme FORMAT_DATE renvoie déjà STRING

1

%Y retournera l'année civile pour une date plutôt que l'année ISO. Pour retourner l'année ISO, qui sera 2016 pour le 1er janvier 2017, utilisez %G à la place. Voir aussi Supported Format Elements for DATE.