1

私はデータ変換を行っており、特定の週の開始日と終了日を取得する必要があります。

ソースの日付は 1 つのint列に格納されています'year_wk'

この列の例は次のとおりです。

201201 - 2012 年の第 1 週を意味します。 201005 - 2010 年の第 5 週を意味します。

mm/dd/yyyy特定の週の開始日と終了日を標準形式で取得したいと考えています。

したがって、201201 は、2012 年 1 月 1 日と 2012 年 1 月 7 日のようなものになります。

4

5 に答える 5

3

見栄えが悪く、非常に効率的ではないかもしれませんが、ビューを活用できますSYS_CALENDAR.CALENDAR。この例では、すべての Teradata インストールのデフォルト データベースでSELECT *あるビューで使用可能なすべての属性を確認できるように、意図的に使用しています。SYS_CALENDAR.CALENDAR

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);
于 2013-01-24T17:51:28.100 に答える
2

Teradata には詳しくありませんが、2013 年全体の週の開始日と終了日を含む Oracle ISO 週クエリを次に示します。これはどの 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

于 2013-01-24T18:19:25.177 に答える
1

特定の年の開始日と終了日のテーブルを作成する 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 
于 2013-01-24T17:17:18.103 に答える
0

私の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
于 2016-07-31T08:34:03.143 に答える