날짜가 특정 요일 인 항목을 선택하고 싶습니다. 예를 들어특정 주에있는 날짜 찾기
: 주 44 월요일 10분의 31에서 일요일 06/11이다
SELECT item
FROM table
WHERE my_date in week 44
.
나는 그렇게 할 수있는 방법
와 주 번호를 얻기 위해 알아? 감사합니다. .
날짜가 특정 요일 인 항목을 선택하고 싶습니다. 예를 들어특정 주에있는 날짜 찾기
: 주 44 월요일 10분의 31에서 일요일 06/11이다
SELECT item
FROM table
WHERE my_date in week 44
.
나는 그렇게 할 수있는 방법
와 주 번호를 얻기 위해 알아? 감사합니다. .
시도 :
https://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements004.htm#i34924
IW ---> 년 (1-52 또는 1-53)의 주에 기초 :
SELECT item FROM table WHERE to_char(my_date, 'IW) = '44'
하는 자세한 내용은이 링크를 참조하십시오 ISO 표준. 주 1 월에 전년와 처음 일을 시작할 수 있기 때문에 ISO의 주 작업
가 될 수 년 않고 단지 주 번호를 제공, 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;
ISO 주간 작업은 간단합니다 ('trunc (dt, 'iw')') - 그렇지 않은 non-iso 주입니다. 그들이 가질 수있는 다양한 정의 때문에 사소한 것입니다. ISO 주 고정, 그래서 ... – Boneist
: "방법이 하나를 것 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
이 오른쪽에 계산이 많이 있지만, 그들은 모든 행에 대해 한 번만 완료 너의 테이블; 본질적으로 전혀 시간이 걸리지 않을 것입니다.
'my_date'가'DATE' 컬럼 인 경우, to_date (my_date, 'MM/DD/YYYY') 표현식은 전혀 이해가되지 않습니다. 'DATE'를 단지 varchar로 변환하여 다시 시작하는 'DATE'로 다시 변환합니다. 이미'date' 인 값에 대해서는'to_date()'를 호출하지 마십시오 –
@ a_horse_with_no_name의 주석에 대해서 :'my_date' 컬럼은 어떤 데이터 타입입니까? 복합 함수가 varchar2 인 경우 올바르게 표시됩니다 (DATE 데이터 유형이어야하며 불량한 테이블 디자인이 매우 일반적이며 종종 처리 한 손을 재생해야 함). – mathguy
my_date는 DATE입니다. to_char (my_date, 'IW') – iAmoric