2011-04-01 127 views
6

我需要得到的第一天,一週中的一些字符串有這樣的格式的最後一天:如何在Oracle中獲得第一週和最後一天?

「201118」

,其中2011年是18是週數。瞭解本週的數字,我如何獲得本週的第一天和最後一天?

我該怎麼做?

+0

這可能幫助:http://forums.oracle.com/forums/thread.jspa?threadID=849332 – nix 2011-04-01 15:35:54

+0

因爲可能這個http://asktom.oracle.com/pls/asktom/f?p = 100:11:0 :::: P11_QUESTION_ID:7482139067917 – diagonalbatman 2011-04-01 15:40:22

回答

1

假設你的意思是相對於去年的第一天星期...

SELECT first_day_of_week, first_day_of_week+6 last_day_of_week 
FROM (
    SELECT TO_DATE(YEAR||'0101','YYYYMMDD') + 7 * (week-1) first_day_of_week 
    FROM (
    SELECT substr(yearweek,1,4) YEAR, to_number(substr(yearweek,5)) week 
    FROM (
     SELECT '201118' yearweek FROM dual 
    ) 
) 
) 
; 
+0

其實,我需要一週的第一天是星期一,而最後一天是星期天。代碼201053代表2010年的最後一週,也可能包含2011年的第一天。例如,201053是2010年12月29日 - 2011年5月1日。像這樣的東西...... – Alex 2011-04-04 06:52:13

-1

我認爲這只是一個簡單的SELECT語句。我希望它的作品,因爲我不能在家裏測試它,因爲我沒有在這裏有一個Oracle數據庫;-)

select to_date('201118', 'YYYYWW'), to_date('201118', 'YYYYWW')+7 from dual; 

你必須要小心,因爲有WW和IW之間的差異。這裏有一篇文章解釋了這種區別:http://rwijk.blogspot.com/2008/01/date-format-element-ww.html

+2

不幸的是,'WW'和'IW'日期格式似乎只是輸出。我也是先試了一下。 – 2011-04-01 15:44:08

0

除非這是一次性的數據轉換,否則您將有機會使用日曆表。

擁有這樣的表格可以非常容易地過濾或彙總非標準期間的數據,其中增加到正常ISO周。通常情況下,周和公司內部的部門行爲有所不同。只要您離開「ISO-land」,內置日期功能就無法幫助您。

create table calender(
    day   date  not null -- Truncated date 
    ,iso_year_week number(6) not null -- ISO Year week (IYYYIW) 
    ,retail_week number(6) not null -- Monday to Sunday (YYYYWW) 
    ,purchase_week number(6) not null -- Sunday to Saturday (YYYYWW) 
    ,primary key(day) 
); 

您可以創建附加表的「purchase_weeks」或「retail_weeks」,或者乾脆聚集在飛行:

select a.colA 
     ,a.colB 
     ,b.first_day 
     ,b.last_day 
    from your_table_with_weeks a 
    join (select iso_year_week 
       ,min(day) as first_day 
       ,max(day) as last_day 
      from calendar 
     group 
      by iso_year_week 
     ) b on(a.iso_year_week = b.iso_year_week) 

如果你處理大量的記錄,彙總上飛韓元不會有明顯的差異,但如果你正在執行單排,你也可以從幾周的表格中創建表格。

使用日曆表提供了微妙的性能優勢,因爲優化程序可以提供更好的靜態列估計而不是嵌套add_months(to_date(to_char()))函數調用。

0

你可以試試這個方法:

  1. 獲取當前日期。

  2. 添加等於當前日期年份和指定年份之間差異的年數。

  3. 減去上次獲取日期的星期幾的天數(它會給我們幾周的最後一天)。

  4. 添加最後獲取的日期的星期數與指定的星期數之差的週數,這將產生所需星期的最後一天。

  5. 減去6天以獲得第一天。

0

其實,我做了這樣的事情:

select case myconfigtable.valpar 
    when 'WEEK' then to_char(next_day(datetime-7,'Monday'),'DD/MM/YYYY')|| ' - '|| to_char(next_day(datetime,'Sunday'),'DD/MM/YYYY') 
    when 'MONTH' then to_char(to_date(yearweek,'yyyyMM'),'DD/MM/YYYY') || ' - '|| to_char(last_day(to_date(yearweek,'yyyyMM')),'DD/MM/YYYY') 
    else 'NA' 
    end 

從 ( 選擇TO_DATE(YEAR ||'01' , 'YYYYMM')+ 7 *(周 - 1)日期時間,年周 從 ( 選擇SUBSTR(年周,1,4)YEAR, TO_NUMBER(SUBSTR(年周,5))WEEK, 年周 從(選擇雙 '201018' 年周) ) ),myconfigtable myconfigtable 其中myconfigtable.codpar = 'TYPEOFPERIOD'

2
SQL> var P_YEARWEEK varchar2(6) 
SQL> exec :P_YEARWEEK := '201118' 

PL/SQL procedure successfully completed. 

SQL> with t as 
    2 (select substr(:P_YEARWEEK,1,4) year 
    3   , substr(:P_YEARWEEK,5,2) week 
    4  from dual 
    5 ) 
    6 select year 
    7  , week 
    8  , trunc(to_date(year,'yyyy'),'yyyy')        january_1 
    9  , trunc(trunc(to_date(year,'yyyy'),'yyyy'),'iw')     monday_week_1 
10  , trunc(trunc(to_date(year,'yyyy'),'yyyy'),'iw') + (week - 1) * 7 start_of_the_week 
11  , trunc(trunc(to_date(year,'yyyy'),'yyyy'),'iw') + week * 7 - 1 end_of_the_week 
12 from t 
13/

YEAR WE JANUARY_1   MONDAY_WEEK_1  START_OF_THE_WEEK END_OF_THE_WEEK 
---- -- ------------------- ------------------- ------------------- ------------------- 
2011 18 01-01-2011 00:00:00 27-12-2010 00:00:00 25-04-2011 00:00:00 01-05-2011 00:00:00 

1 row selected. 

問候,
羅布。

2
SELECT NEXT_DAY (TO_DATE ('01/01/'||SUBSTR('201118',1,4),'MM/DD/YYYY')+(TO_NUMBER(SUBSTR('201118',5,2))*7)-3,'SUNDAY')-7 first_day_wk, 
    NEXT_DAY (TO_DATE ('01/01/'||SUBSTR('201118',1,4),'MM/DD/YYYY')+(TO_NUMBER(SUBSTR('201118',5,2))*7)-3,'SATURDAY') last_day_wk FROM dual 
(星期一)本週
-1

第一天:

SELECT TO_DATE(to_char(sysdate,'YYYY')||'0101','YYYYMMDD') + 7 * to_number(to_char(sysdate,'WW')-1)-1 first_day_week FROM dual; 

上週的日(星期日):

SELECT TO_DATE(to_char(sysdate,'YYYY')||'0101','YYYYMMDD') + 7 * to_number(to_char(sysdate,'WW')-1)+5 last_day_week FROM dual; 

替換您的日期或日期字段,這些公式會爲你工作!

8

如果您使用的是Oracle,這個代碼可以幫助您:

select 
TRUNC(sysdate, 'YEAR') Start_of_the_year, 
TRUNC(sysdate, 'MONTH') Start_of_the_month, 
TRUNC(sysdate, 'DAY') start_of_the_week, 
TRUNC(sysdate+365, 'YEAR')-1 End_of_the_year, 
TRUNC(sysdate+30, 'MONTH')-1 End_of_the_month, 
TRUNC(sysdate+6, 'DAY')-1 end_of_the_week 
from dual; 


select 
TRUNC(sysdate, 'YEAR') Start_of_the_year, 
TRUNC(sysdate+365, 'YEAR')-1 End_of_the_year, 
TRUNC(sysdate, 'MONTH') Start_of_the_month, 
TRUNC(sysdate+30, 'MONTH')-1 End_of_the_month, 
TRUNC(sysdate, 'DAY')+1 start_of_the_week, -- starting Monday 
TRUNC(sysdate+6, 'DAY') end_of_the_week  -- finish Sunday 
from dual; 
14

WEEK

select TRUNC(sysdate, 'iw') AS iso_week_start_date, 
     TRUNC(sysdate, 'iw') + 7 - 1/86400 AS iso_week_end_date 
from dual; 

select 
TRUNC (sysdate, 'mm') AS month_start_date, 
LAST_DAY (TRUNC (sysdate, 'mm')) + 1 - 1/86400 AS month_end_date 
from dual; 
+0

如果您想提取日期的其他元素,這對Oracle文檔很有用 - 當前位置:http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions230.htm#i1002084或Google for 「oracle中的round和trunc日期函數」如果他們移動它 – JamesF 2014-09-09 04:18:20

1

又一解決方案(星期一是第一天):

select 
    to_char(sysdate - to_char(sysdate, 'd') + 2, 'yyyymmdd') first_day_of_week 
    , to_char(sysdate - to_char(sysdate, 'd') + 8, 'yyyymmdd') last_day_of_week 
from 
    dual 
相關問題