关于Teradata SQL周编号:Teradata SQL周编号-从1月1日开始的第1周,其周与一周中的特定日期对齐

Teradata SQL Week Number - Week 1 starting 1st Jan with weeks aligned to specific day of the week

我在这里的第一篇文章,所以请保持温柔...

我正在尝试在Teradata(SQL)中创建一个星期数变量,该变量执行以下操作:

  • 第1周始终从给定年份的1月1日开始
  • 周数在一周的指定日期递增

例如:如果星期六是一周中的指定日期:

  • 2019-01-01将是2019年第一周的开始,更改为2019-01-05的第二周
  • 2020-01-01将是2020年第1周的开始,更改为2020-01-04的第2周

我已经基于Excel函数提出了以下建议,但是它并没有按预期工作:

ROUND(((DATE_SPECIFIED - CAST(EXTRACT(YEAR FROM DATE_SPECIFIED) || '-01-01' AS DATE) + 1) - ((DATE_SPECIFIED - DATE '0001-01-06') MOD 7 + 1) + 10) / 7) AS REQUIRED_WEEK

- DATE '0001-01-06'部分的最后一位数字与一周中的指定日期相关,其中" 0001-01-01"将为星期一。

在某些情况下可以使用,但是在某些年份中,第一个星期的数字显示为0,应为1,例如2018年1月1日/ 2019年1月1日很好,而2020年1月1日不是。

我们将很高兴收到任何纠正此问题的想法。

非常感谢,

迈克


您可以将NEXT_DAY应用于指定的日期和该年的1月1日,例如从周六开始的周六:

1
(Next_Day(DATE_SPECIFIED,'SAT') - Next_Day(Trunc(DATE_SPECIFIED,'yyyy'),'SAT')) / 7 +1


嗯。 。 。我在Teradata函数上花了一周的时间。但想法是开始第二周。这遵循以下规则:

1
2
3
4
5
6
7
8
Jan 1      weekday (TD)     2nd week
Sunday        1               01-02
Monday        2               01-08
Tuesday       3               01-07
Wednesday     4               01-06
Thursday      5               01-05
Friday        6               01-04
Saturday      7               01-03

我认为以下逻辑对此进行了计算:

1
2
3
4
5
SELECT t.*,
       (CASE WHEN td_day_of_week(CAST(EXTRACT(YEAR FROM DATE_SPECIFIED) || '-01-01' AS DATE) ) = 1
             THEN CAST(EXTRACT(YEAR FROM DATE_SPECIFIED) + '-01-02' AS DATE)
             ELSE EXTRACT(YEAR FROM DATE_SPECIFIED) + 10 - CAST(td_day_of_week(CAST(EXTRACT(YEAR FROM DATE_SPECIFIED) || '-01-01') AS DATE)
FROM t;

那么您是从第二周算起还是从一周算起,再减去一个星期才能得出第一周真正开始的时间。