我需要得到的第一天,一週中的一些字符串有這樣的格式的最後一天:如何在Oracle中獲得第一週和最後一天?
「201118」
,其中2011年是18是週數。瞭解本週的數字,我如何獲得本週的第一天和最後一天?
我該怎麼做?
我需要得到的第一天,一週中的一些字符串有這樣的格式的最後一天:如何在Oracle中獲得第一週和最後一天?
「201118」
,其中2011年是18是週數。瞭解本週的數字,我如何獲得本週的第一天和最後一天?
我該怎麼做?
假設你的意思是相對於去年的第一天星期...
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
)
)
)
;
其實,我需要一週的第一天是星期一,而最後一天是星期天。代碼201053代表2010年的最後一週,也可能包含2011年的第一天。例如,201053是2010年12月29日 - 2011年5月1日。像這樣的東西...... – Alex 2011-04-04 06:52:13
我認爲這只是一個簡單的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
不幸的是,'WW'和'IW'日期格式似乎只是輸出。我也是先試了一下。 – 2011-04-01 15:44:08
除非這是一次性的數據轉換,否則您將有機會使用日曆表。
擁有這樣的表格可以非常容易地過濾或彙總非標準期間的數據,其中增加到正常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()))
函數調用。
你可以試試這個方法:
獲取當前日期。
添加等於當前日期年份和指定年份之間差異的年數。
減去上次獲取日期的星期幾的天數(它會給我們幾周的最後一天)。
添加最後獲取的日期的星期數與指定的星期數之差的週數,這將產生所需星期的最後一天。
減去6天以獲得第一天。
其實,我做了這樣的事情:
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'
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.
問候,
羅布。
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
(星期一)本週
第一天:
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;
替換您的日期或日期字段,這些公式會爲你工作!
如果您使用的是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;
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;
如果您想提取日期的其他元素,這對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
又一解決方案(星期一是第一天):
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
這可能幫助:http://forums.oracle.com/forums/thread.jspa?threadID=849332 – nix 2011-04-01 15:35:54
因爲可能這個http://asktom.oracle.com/pls/asktom/f?p = 100:11:0 :::: P11_QUESTION_ID:7482139067917 – diagonalbatman 2011-04-01 15:40:22