将字符串转换为日期格式(从周数开始)
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
我有一个字符串,周数从 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