【问题标题】:Day of week last year去年星期几
【发布时间】:2019-07-02 15:34:57
【问题描述】:

我试图在标准 SQL BigQuery 中计算去年同一周的等效当前日期。

例如,如果当前日期 2019-07-01 是第 27 周的星期一。我想知道去年(2018 年)第 27 周的星期一的日期。

当前周为select extract(isoweek from current_date()) 但我不知道如何使用它来计算日期。

如果当前日期为 2019-07-01,则预期输出为 2018-07-02

这样做的原因是我想将当前销售额与去年相同的星期和星期几进行比较。

欢迎提出任何建议。

【问题讨论】:

  • 如果上一年没有等价物怎么办?有些年份的 ISO 周数不同。
  • 你是对的。这总是一个问题,但这是衡量它的方式。

标签: google-bigquery


【解决方案1】:

这样的事情应该会让你继续前进......

with dates as (select * from unnest(generate_date_array('2018-01-01','2019-12-31', interval 1 day)) as cal_date),
       cal as (select cal_date, cast(format_date('%Y', cal_date) as int64) as year, cast(format_date('%V', cal_date) as int64) as week_num, format_date('%A', cal_date) as weekday_name from dates)
select c1.cal_date, c1.week_num, c1.weekday_name, c2.cal_date as previous_year_same_weekday
from cal c1
inner join cal c2 
  on c1.year = c2.year+1 and c1.week_num = c2.week_num and c1.weekday_name = c2.weekday_name

上述查询使用从星期一开始的一周,您可能需要使用format_date() 参数as seen here 来修改它以满足您的需要。

【讨论】:

  • 谢谢。这给了一些想法如何进行!我将创建一个表并加入这个“日历”表。
  • 示例 SQL 返回 2019-12-30 的两个条目。一个用于 2018 年 1 月 1 日星期一,一个用于 2018 年 12 月 31 日星期一(后者似乎是正确的,因为它是大约 12 个月前)
【解决方案2】:

此查询不返回任何结果,这意味着 SHIFT 有效。如果一年的周数与其前一年的周数不同,则该函数返回 NULL

CREATE TEMP FUNCTION P_YEAR(y INT64) AS (
  MOD(CAST(y + FLOOR(y / 4.0) - FLOOR(y / 100.0) + FLOOR(y / 400.0) AS INT64), 7)
);

CREATE TEMP FUNCTION WEEKS_YEAR(y INT64) AS (
  52 + IF(P_YEAR(y) = 4 OR P_YEAR(y - 1) = 3, 1, 0)
);

CREATE TEMP FUNCTION SHIFT(d DATE) RETURNS DATE AS (
  CASE
    WHEN WEEKS_YEAR(EXTRACT(ISOYEAR FROM d)) != WEEKS_YEAR(EXTRACT(ISOYEAR FROM d) - 1)
      THEN null
    WHEN WEEKS_YEAR(EXTRACT(ISOYEAR FROM d)) = 52
      THEN DATE_SUB(d, INTERVAL 52 WEEK)
    ELSE d
  END
);

WITH dates AS (
SELECT d
FROM UNNEST(GENERATE_DATE_ARRAY('2000-12-31', '2020-12-31', INTERVAL 1 DAY)) AS d
)
SELECT
 d,
 EXTRACT(ISOWEEK FROM d) AS orig_iso_week,
 EXTRACT(ISOWEEK FROM SHIFT(d)) AS new_iso_week,
 SHIFT(d) AS new_d
FROM dates
WHERE EXTRACT(ISOWEEK FROM d) != EXTRACT(ISOWEEK FROM SHIFT(d))
  AND SHIFT(d) IS NOT NULL

【讨论】:

  • 谢谢!尽管我将使用其他解决方案,但这给了我未来使用的好主意。
猜你喜欢
  • 1970-01-01
  • 2018-06-06
  • 1970-01-01
  • 1970-01-01
  • 2013-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-22
相关资源
最近更新 更多