将字符串转换为日期格式(从周数开始)

Transform string to date format ( from week number )

我有一个字符串,周数从 1 到 53(从 2015 年开始分周),年份的形式为:

    Date_ID
    KW01/2016
    KW35/2014
    KW51/2014
    KW53/2015
    KW12/2014
    KW03/2016
    ...

并且我想将整个列转换为日期格式(开始日期为星期一就足够了)

我试过了

sel cast(substr(Date_ID,3,7) as date format 'ww/yyyy')  from database

但 ww 不是周数的缩写,我没有找到绕过它的方法。使用 teradata 甚至可以从几周到现在的转换吗?

这个想法用于 sys_calendar table Teradata。它有一年中的几周和其他内容。下面是代码。

insert into test values('KW01/2016');   
insert into test values('KW35/2014');   
insert into test values('KW51/2014');   
insert into test values('KW53/2015');   
insert into test values('KW12/2014');  
insert into test values('KW03/2016');   


select       calendar_date   
from         test a    
inner join   sys_calendar.calendar b    
on          substr(name,3, 2) = b.week_of_year       
and         substr(name,6, 4) =b.year_of_calendar    
and         day_of_week = 2

day_of_week = 2 给你星期一。如果您想要星期天,请将其更改为 1。

那些周数似乎是基于 ISO 而 Teradata 的 sys_calendar.calendar 是基于美国周。

还有一个 sys_calendar.business_calendar 可以使用 set session calendar = iso 设置为 ISO,但实现完全有缺陷:)

现在有个好消息:您的公司通常会创建一个日历,其中包含许多预先计算的列,其中一个 might/should 是 year/week。然后它只是一个像 Date_ID = yearweekcolumn and dayofweek = monday.

这样的连接

或者你使用我几年前写的 UDF,修改为你的输入:

-- Calculate the first day of an ISO week (monday)
REPLACE FUNCTION isoweek_to_date(isoweek VARCHAR(9))
RETURNS DATE
SPECIFIC isoweek_to_date_c
LANGUAGE SQL
CONTAINS SQL
DETERMINISTIC
SQL SECURITY DEFINER
COLLATION INVOKER
INLINE TYPE 1
RETURN 
      (((CAST(SUBSTRING(isoweek FROM 6 FOR 4) AS INT) -1900) * 10000 + 104) (DATE))
  +    ((CAST(SUBSTRING(isoweek FROM 3 FOR 2) AS INT) - 1) * 7)
  - (((((CAST(SUBSTRING(isoweek FROM 6 FOR 4) AS INT) -1900) * 10000 + 104) (DATE)) - DATE '0001-01-01') MOD 7)
;

isoweek_to_date('KW01/2016') returns`2016-01-04