Oracle에서 일주일 중 첫 번째와 마지막 날을 얻는 방법은 무엇입니까?
다음과 같은 형식을 가진 문자열에서 첫 번째 날과 마지막 날을 가져와야 합니다.
'201118'
여기서 2011은 연도이고 18은 주의 숫자입니다.주수를 알고 있는데, 주수의 첫 날과 마지막 날은 어떻게 알 수 있습니까?
이거 어떻게 하는 거지?
일주일
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을 사용하는 경우 이 코드를 사용하면 다음과 같은 이점이 있습니다.
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;
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
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
)
)
)
;
SELECT TRUNC(SYSDATE,'D') "1ST_DAY", TRUNC(SYSDATE,'D') + 6 LAST_DAY FROM DUAL
다음과 같은 방법을 시도할 수 있습니다.
현재 날짜를 가져옵니다.
현재 날짜의 연도와 지정된 연도 간의 차이와 동일한 연도 수를 추가합니다.
마지막으로 얻은 날짜의 요일 번호인 일 수를 뺍니다. 그러면 특정 주의 마지막 날이 표시됩니다.
마지막으로 얻은 날짜의 주 번호와 지정된 주 번호 간의 차이인 주 수를 추가하고 원하는 주의 마지막 날을 산출합니다.
첫 번째 날을 얻으려면 6일을 빼십시오.
일회성 데이터 변환이 아닌 한 달력 표를 사용하면 이점을 얻을 수 있습니다.
이러한 테이블을 사용하면 일반적인 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()))
함수 호출
또 다른 솔루션(월요일이 첫 번째 날):
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
또 다른 해결책은
SELECT
ROUND((TRUNC(SYSDATE) - TRUNC(SYSDATE, 'YEAR')) / 7,0) CANTWEEK,
NEXT_DAY(SYSDATE, 'SUNDAY') - 7 FIRSTDAY,
NEXT_DAY(SYSDATE, 'SUNDAY') - 1 LASTDAY
FROM DUAL
당신은 캔트위크를 연도와 일치시켜야 합니다.
@만일의 대답, 결점이 있습니다, 만약에.sysdate
일요일이고 다음 주 월요일을 반환합니다.그의 답변에 영감을 받아 몇 주 동안 테스트한 내용을 소개합니다.
select
(sysdate - to_char(sysdate-1, 'd') + 1) first_day_of_week --A monday here
from dual
사실, 저는 다음과 같은 일을 했습니다.
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
from
(
select to_date(YEAR||'01','YYYYMM') + 7 * (WEEK - 1) datetime, yearweek
from
(
select substr(yearweek,1,4) YEAR,
to_number(substr(yearweek,5)) WEEK,
yearweek
from (select '201018' yearweek from dual
)
)
), myconfigtable myconfigtable
where myconfigtable.codpar='TYPEOFPERIOD'
- 리스트 항목
Truc(sysdate, 'DAY')
합니다.
- 리스트 항목
Truc(sysdate, 'DAY')+1
합니다.
저는 이것이 단순한 선택적 진술이라고 생각합니다.집에서 테스트할 수 없었기 때문에, 여기에 오라클 데이터베이스가 없기 때문에, 잘 되길 바랍니다;-)
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
첫째 주(월요일):
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;
이러한 공식에서 날짜 또는 날짜 필드를 대체하면 효과가 있습니다!
언급URL : https://stackoverflow.com/questions/5515514/how-to-get-first-and-last-day-of-week-in-oracle
'it-source' 카테고리의 다른 글
플라스크에서 자바스크립트로 데이터를 템플릿으로 전달하려면 어떻게 해야 합니까? (0) | 2023.07.20 |
---|---|
컨테이너 객체(Python)에 __iter__(자체)를 구현하는 방법 (0) | 2023.07.20 |
Oracle SQL에서 MERGE를 수행할 때 소스에서 일치하지 않는 행을 업데이트하려면 어떻게 해야 합니까? (0) | 2023.07.20 |
python: 디렉터리를 두 단계 위로 가져옵니다. (0) | 2023.07.20 |
SQL Server를 사용하여 빈 공간을 null 값으로 변환하는 방법은 무엇입니까? (0) | 2023.07.20 |