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