【问题标题】:Transform string to date format ( from week number )将字符串转换为日期格式(从周数)
【发布时间】:2017-01-22 08:16:36
【问题描述】:

我有一个字符串,其中周数从 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 甚至可以从周到日期进行转换吗?

【问题讨论】:

    标签: date teradata


    【解决方案1】:

    这个想法是用于 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。

    【讨论】:

      【解决方案2】:

      这些周数似乎基于 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

      【讨论】:

      • 您的权利,我们的数据仓库中有一张表格可以获取 ISO 周数!谢谢你们俩
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-28
      • 1970-01-01
      • 2014-01-18
      • 2019-10-13
      相关资源
      最近更新 更多