2016-10-31 3 views
2

날짜가 특정 요일 인 항목을 선택하고 싶습니다. 예를 들어특정 주에있는 날짜 찾기

: 주 44 월요일 10분의 31에서 일요일 06/11이다

SELECT item 
FROM table 
WHERE my_date in week 44 

.

나는 그렇게 할 수있는 방법

와 주 번호를 얻기 위해 알아? 감사합니다. .

+2

'my_date'가'DATE' 컬럼 인 경우, to_date (my_date, 'MM/DD/YYYY') 표현식은 전혀 이해가되지 않습니다. 'DATE'를 단지 varchar로 변환하여 다시 시작하는 'DATE'로 다시 변환합니다. 이미'date' 인 값에 대해서는'to_date()'를 호출하지 마십시오 –

+1

@ a_horse_with_no_name의 주석에 대해서 :'my_date' 컬럼은 어떤 데이터 타입입니까? 복합 함수가 varchar2 인 경우 올바르게 표시됩니다 (DATE 데이터 유형이어야하며 불량한 테이블 디자인이 매우 일반적이며 종종 처리 한 손을 재생해야 함). – mathguy

+0

my_date는 DATE입니다. to_char (my_date, 'IW') – iAmoric

답변

1

가 될 수 년 않고 단지 주 번호를 제공, 52 또는 53

그래서 주일로 계산 될 수 있습니다 사소한 아니다 모호함 (주 번호 52, 53, 1). 이

SELECT item 
FROM table 
WHERE my_date 
    between NEXT_DAY(TO_DATE(yearNo || '0104', 'YYYYMMDD') - INTERVAL '7' DAY, 'MONDAY') + (weekNo - 1) * 7 
     AND 6 + (NEXT_DAY(TO_DATE(yearNo || '0104', 'YYYYMMDD') - INTERVAL '7' DAY, 'MONDAY') + (weekNo - 1) * 7) 

실제로 "전체 오류가 입증 될 것이다 당신의 필요를 위해

내가 ISO-주간의 첫날을 얻기 위해 찾을 수있는 가장 좋은 기능은, 그래서

NEXT_DAY(TO_DATE(yearNo || '0104', 'YYYYMMDD') - INTERVAL '7' DAY, 'MONDAY') + (weekNo - 1) * 7 

입니다 my_date 열의 데이터 형식은 사실, VARCHAR 인 경우

FUNCTION ISOWeekDate(weekNo INTEGER, yearNo INTEGER) RETURN DATE DETERMINISTIC IS 
    res DATE; 
BEGIN 
    IF weekNo > 53 OR weekNo < 1 THEN 
     RAISE VALUE_ERROR;  
    END IF; 
    res := NEXT_DAY(TO_DATE(yearNo || '0104', 'YYYYMMDD') - INTERVAL '7' DAY, 'MONDAY') + (weekNo - 1) * 7; 
    IF TO_CHAR(res, 'fmIYYY') = yearNo THEN 
     RETURN res; 
    ELSE 
     RAISE VALUE_ERROR; 
    END IF; 
END ISOWeekDate; 
+1

ISO 주간 작업은 간단합니다 ('trunc (dt, 'iw')') - 그렇지 않은 non-iso 주입니다. 그들이 가질 수있는 다양한 정의 때문에 사소한 것입니다. ISO 주 고정, 그래서 ... – Boneist

0

: "방법이 하나를 것 2 (그럴 필요는 없지만 종종 그렇습니다), 그런 다음 먼저 날짜로 변환 한 다음 다른 형식으로 char (문자열)로 다시 변환해야합니다. 그런 다음 44가 반드시 숫자 일 필요는 없지만 계산, 하위 쿼리 또는 다른 테이블의 값일 수 있습니다 (NUMBER 데이터 유형 인 경우). 그러면 수행중인 작업을 정확하게 수행해야합니다. . 그게 무슨 문제였습니까?

select item 
from your_table 
where to_number(to_char(to_date(my_date,'MM/DD/YYYY'),'IW')) = 44; 

혹시 이것이보다 효율적으로 수행 될 수 있는지 알고 싶으십니까? 따라서 예를 들어, 대신 my_date의 인덱스의 사용을 허용 할

my_date between (something) and (something else) 

where 조건을 쓸 수 있습니까? 대답은 NO입니다. my_date이 VARCHAR2 형식 인 경우 - 색인을 잃어 버리기 때문에 여전히 to_date() 내에 포장해야합니다.

그러나 다른 쿼리에서도 도움이 될 to_date(my_date)에 색인 기능을 만들 수 있습니다. 따라서 현재 쿼리를보다 효율적으로 만드는 문제는 의미가 있습니다.이제 잘 정의되지 않은 ISO 주간의 복잡성에 직면하게됩니다 (어느 연도를 말하지 않고있는 것입니다.) 그래서 날짜가 ISO 44 번째 주일이되기를 원합니다. 날짜가 순수 날짜 (00:00:00 동일한 시간 구성 요소), 당신이 할 수 있습니다 :

where to_date(my_date, 'MM/DD/YYYY') between 
      trunc(sysdate, 'iw') + 7 * (44 - to_number(to_char(sysdate, 'iw')))  and 
      trunc(sysdate, 'iw') + 7 * (44 - to_number(to_char(sysdate, 'iw'))) + 6 

이 오른쪽에 계산이 많이 있지만, 그들은 모든 행에 대해 한 번만 완료 너의 테이블; 본질적으로 전혀 시간이 걸리지 않을 것입니다.