【问题标题】:Finding Start and end Date for a week given the week of a year in Teradata (SQL)在 Teradata 中查找一周的开始和结束日期(SQL)
【发布时间】:2013-01-08 12:10:02
【问题描述】:

我正在进行数据转换,我需要获取给定一周的开始和结束日期。

我的来源将日期存储在单个int'year_wk'

此列的示例是

201201 - 表示 2012 年的第一周 201005 - 表示 2010 年的第五周

我想以标准 mm/dd/yyyy 格式获取给定一周的开始和结束日期。

所以 201201 会给我类似 1/1/2012 和 1/7/2012。

【问题讨论】:

  • 你能把year_wk改成一个日期吗?
  • 别忘了感谢给你留下这个烂摊子的人。对喉部的推力踢将是一个好的开始。你的一周是从周日还是周一开始?
  • 最重要的问题 - 这些是 ISO 周年吗?在 ISO 周年中,第一周有时从上一个日历年开始(对于 2013 年,第 1 周从 2012 年 12 月 31 日开始),因为它基于特定日历年一周中的最少天数 (4) .哦,通常最好将日期考虑在“包含下限,独占上限”范围内 - 你的一周应该被认为是>= 2012-01-01 and < 2012-01-08,这使得处理时间戳之类的事情很多更容易。

标签: sql teradata


【解决方案1】:

它不会很漂亮,也可能效率不高,但您可以利用 SYS_CALENDAR.CALENDAR 的视图。我特意在示例中使用了SELECT *,这样您就可以通过SYS_CALENDAR.CALENDAR 视图查看所有可用的属性,该视图是所有Teradata 安装的默认数据库:

SELECT *
  FROM Sys_Calendar."CALENDAR"
 WHERE Year_of_Calendar = CAST(SUBSTRING('201201' FROM 1 FOR 4) AS INTEGER)
   AND Week_of_Year = CAST(SUBSTRING('201201' FROM 5 FOR 2) AS INTEGER)
UNION
SELECT *
  FROM  Sys_Calendar."CALENDAR"
 WHERE Year_of_Calendar = CAST(SUBSTRING('201005' FROM 1 FOR 4) AS INTEGER)
   AND Week_of_Year = CAST(SUBSTRING('201005' FROM 5 FOR 2) AS INTEGER);

【讨论】:

    【解决方案2】:

    我不熟悉 Teradata,但这是 Oracle ISO 周查询,其中包含 2013 年全年的周开始和结束日期。这应该适用于任何 SQL。对于非 iso 周,将周格式更改为 WW - 忘记在查询中将 mydate 重命名为 start_date:

    SELECT mydate                               -- 1/1/2013 --
         , TRUNC(mydate, 'iw')                  wk_starts  
         , TRUNC(mydate, 'iw') + 7 - 1/86400    wk_ends
         , TO_NUMBER (TO_CHAR (mydate, 'IW'))   ISO_wk#_iw  
         , TRUNC(mydate, 'w')                   week_start_date
         , TRUNC(mydate, 'w') + 7 - 1/86400 AS  week_end_date
     FROM
     (
      SELECT TRUNC(SYSDATE, 'YEAR')-1 + LEVEL AS mydate  -- 11/1/2013 --
        FROM dual
      CONNECT BY LEVEL <= 
      (-- First day of next year - first day of curr year --
       SELECT TRUNC(ADD_MONTHS (SYSDATE, 12), 'Y')-TRUNC(SYSDATE, 'Y') "Num of Days"   
         FROM dual
      )
    )
    /
    
    SQL>
    
    START_DATE  WK_STARTS   WK_ENDS                ISO_WK#
    ------------------------------------------------------------------
    1/1/2013    12/31/2012  1/6/2013 11:59:59 PM    1
    1/2/2013    12/31/2012  1/6/2013 11:59:59 PM    1
    ...
    ...
    1/7/2013    1/7/2013    1/13/2013 11:59:59 PM   2
    1/8/2013    1/7/2013    1/13/2013 11:59:59 PM   2
    ...
    ...
    1/14/2013   1/14/2013   1/20/2013 11:59:59 PM   3
    1/15/2013   1/14/2013   1/20/2013 11:59:59 PM   3
    

    周数日历:http://www.epochconverter.com/date-and-time/weeknumbers-by-year.php

    【讨论】:

      【解决方案3】:

      下面是一些 SQL 代码,用于构建给定年份的开始和结束日期表。

      如果您为所有相关年份构建此表,其余部分应通过 JOIN 语句完成

      -- Create weekrange table
      Create table Weekrange
      (YearNo INT,
       WeekNo INT,
       StartDay DATETIME,
       EndDay DATETIME)
      -- Populate first row
      insert into WeekRange
      select 2013,1, DateAdd(d,-DATEPART(dw,'1/1/2013'),'1/1/2013')+1 as FirstDay,null    -- Compute first day
      update Weekrange set EndDay = DATEADD(D,6,StartDay)                                 -- Determine last day
      
      -- Add next 52 rows
      declare @id INT
      set @id=2
      while @id <=53
      begin
          insert into Weekrange (YearNo,WeekNo) values (2013,@id)
          set @id=@id+1
          update Weekrange 
          set StartDay = DATEADD(D,1,xx.EndDay),
              EndDay = DATEADD(D,7,xx.EndDay)
          from 
          (select * from WeekRange ) xx
          where xx.weekno=weekrange.WeekNo-1
      end 
      
      
      select * from Weekrange 
      

      【讨论】:

      • 注意,这是在 Microsoft SQL 服务器中,因此您可能需要调整一些日期函数。您也可以在 Microsoft Excel 中构建一个类似的表并将其导入 SQL
      【解决方案4】:

      尝试改进我的 SQL,这将是一个简单的建议:

       SELECT CALENDAR_DATE,DAY_OF_WEEK
       FROM SYS_CALENDAR.CALENDAR TERADATA
       WHERE SUBSTR(CAST((CAST(CALENDAR_DATE AS DATE FORMAT 'MMDDYYYY')) AS VARCHAR(8) ),5,4) = '2010'
      AND WEEK_OF_YEAR='05' 
      AND DAY_OF_WEEK IN (1,7)
      ORDER BY CALENDAR_DATE
      

      【讨论】:

        【解决方案5】:
        SELECT TD_WEEK_END (date) - 6
        

        TD_WEEK_END (date) 是周末结束。只需从日期中减去 6 即可获得一周的开始时间。

        注意:此答案集将始终返回星期日,因为星期日是一周的第一天。

        【讨论】:

          猜你喜欢
          • 2023-03-30
          • 2020-02-17
          • 2011-07-30
          • 2023-04-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-10-05
          • 2020-03-21
          相关资源
          最近更新 更多