0

我需要将2016 年最后一周的所有日期按日期转换为YYYYWW格式。

#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

一切OK,直到它达到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' 应该是 ' 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)
4

2 回答 2

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_DATESTRING

于 2017-07-18T13:14:41.743 回答
1

%Y将返回日期的日历年而不是 ISO 年。要返回 ISO 年份,即 2017 年 1 月 1 日的 2016 年,请%G改用。另请参阅DATE 支持的格式元素

于 2017-07-18T12:53:47.750 回答