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

时间:2016-09-14 13:33:23

标签: date teradata

我有一个字符串,周数从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进行数周甚至更短的转换?

2 个答案:

答案 0 :(得分:2)

这个想法是用于Teradata中的sys_calendar表。它有一周的一年和其他东西。以下是代码。

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。

答案 1 :(得分:1)

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

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

现在好消息:您的公司通常会创建一个日历,其中包含许多预先计算的列,其中一个可能/应该是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')返回`2016-01-04