Teradata SQL 周数 - 从 1 月 1 日开始的第 1 周与一周中的特定日期对齐
Teradata SQL Week Number - Week 1 starting 1st Jan with weeks aligned to specific day of the week
我的第一个 post 在这里所以请保持温柔...
我正在尝试在 Teradata (SQL) 中创建一个周数变量,它执行以下操作:
- 第 1 周总是从给定年份的 1 月 1 日开始
- 周数在指定的星期几递增
例如:如果星期六是指定的星期几:
- 2019-01-01 将是 2019 年第 1 周的开始,更改为 2019-01-05 的第 2 周
- 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/2019 年 1 月 1 日可以,而 2020 年 1 月 1 日不行。
如有任何纠正此问题的想法,我们将不胜感激。
非常感谢,
麦克
嗯。 . .我不太了解 Teradata 函数。但想法是让 第二 周开始。这遵循以下规则:
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
我认为计算逻辑如下:
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;
那么你的周是从第二周开始计算还是再减去一周以获得第一周真正开始的时间。
您可以为指定日期和当年的 1 月 1 日申请 NEXT_DAY
,例如星期六作为一周的开始:
(Next_Day(DATE_SPECIFIED,'SAT') - Next_Day(Trunc(DATE_SPECIFIED,'yyyy'),'SAT')) / 7 +1
我的第一个 post 在这里所以请保持温柔...
我正在尝试在 Teradata (SQL) 中创建一个周数变量,它执行以下操作:
- 第 1 周总是从给定年份的 1 月 1 日开始
- 周数在指定的星期几递增
例如:如果星期六是指定的星期几:
- 2019-01-01 将是 2019 年第 1 周的开始,更改为 2019-01-05 的第 2 周
- 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/2019 年 1 月 1 日可以,而 2020 年 1 月 1 日不行。
如有任何纠正此问题的想法,我们将不胜感激。
非常感谢,
麦克
嗯。 . .我不太了解 Teradata 函数。但想法是让 第二 周开始。这遵循以下规则:
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
我认为计算逻辑如下:
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;
那么你的周是从第二周开始计算还是再减去一周以获得第一周真正开始的时间。
您可以为指定日期和当年的 1 月 1 日申请 NEXT_DAY
,例如星期六作为一周的开始:
(Next_Day(DATE_SPECIFIED,'SAT') - Next_Day(Trunc(DATE_SPECIFIED,'yyyy'),'SAT')) / 7 +1