programing

Oracle은 날짜에 '%'와 같이 사용

easyjava 2023. 9. 16. 10:04
반응형

Oracle은 날짜에 '%'와 같이 사용

나의 테이블myTab열이 있습니다.startDate, "DATE"라는 데이터 유형을 가지고 있습니다.이 열의 데이터는 다음과 같이 저장됩니다.dd.mm.yyyy.

이제 다음 쿼리를 사용하여 데이터를 가져오려고 합니다.

SELECT * FROM myTab WHERE startDate like '%01.2015"

어찌된 영문인지 효과가 없는데 왜 그런지 모르겠습니다.

누군가 도와줬으면 좋겠습니다.

날짜에 텍스트를 검색하려면 날짜를 텍스트로 변환해야 합니다.

찾고 싶은 것에 대한 첫 번째 날짜와 마지막 날짜를 계산하고 그 사이에 모든 것을 얻는 것이 더 효율적입니다.이렇게 하면 텍스트 패턴 일치 대신 숫자 비교로 수행되며, 인덱스가 있는 경우 인덱스를 사용할 수 있습니다.

SELECT * FROM myTab WHERE startDate >= DATE '2015-01-01' AND startDate < DATE '2015-02-01'
SELECT * FROM myTab WHERE TO_CHAR(startDate,'dd.mm.yyyy') LIKE '%01.2015'

필드 유형이 "DATE"이면 값이 문자열로 저장되지 않고 Oracle에서 관리하는 숫자이므로 문자열로 변환해야 합니다.

SELECT * FROM myTab WHERE to_char(startDate, 'MM.YYYY') = '01.2015';

SQL 쿼리에서 날짜 범위를 사용할 수도 있습니다.

SELECT * FROM myTab 
WHERE startDate 
BETWEEN to_date('01.01.2015', 'DD.MM.YYYY') 
AND     to_date('31.01.2015', 'DD.MM.YYYY');

당신의 실제 질문에 대해 "어쩐지 잘 안되고 왜 그런지 모르겠습니다."

Oracle은 다음에서 암묵적으로 변환합니다.DATE로.VARHCAR2, 기본값을 사용합니다.NLS_DATE_FORMAT쿼리에서 사용하는 것과 다를 수 있습니다.

이 열의 데이터는 dd.mm .yyyyy와 같이 저장됩니다.

Oracle은 표시된 형식으로 날짜를 저장하지 않습니다.내부적으로 7바이트의 고유 형식으로 저장되며, 각 바이트는 날짜 시간 값의 다양한 구성 요소를 저장합니다.

WHERE startDate '%01.2015' 같은 날짜

날짜문자열과 비교하는 것이므로 의미가 없습니다.

성능 측면에서 날짜 열에 정규 INDEX가 있는 경우 이를 사용하도록 날짜 범위 조건을 사용해야 합니다.

SELECT * FROM table_name WHERE date_column BETWEEN DATE '2015-01-01' AND DATE '2015-02-01'

성능 측면에서 날짜 범위 조건이 더 나은 이유를 이해하려면 여기에서 제 답변을 살펴보십시오.

저는 그런 식으로 문제를 해결했습니다.개선을 위한 제안을 해주셔서 감사합니다.C#의 예.

string dd, mm, aa, trc, data;
dd = nData.Text.Substring(0, 2);
mm = nData.Text.Substring(3, 2);
aa = nData.Text.Substring(6, 4);
trc = "-";
data = aa + trc + mm + trc + dd;

"Select * From bdPedidos Where Data Like '%" + data + "%'";

보다 상세한 답변을 제공하고 https://stackoverflow.com/a/42429550/1267661 답변의 문제를 해결하고자 합니다.

Oracle에서 "날짜" 유형의 열은 숫자나 문자열이 아니며, 연도, 월, 일, 시간, 분, 초를 포함하는 "날짜 시간" 값입니다.기본 시간은 항상 자정 "00:00:00"입니다.

질문:

Select * From bdPedidos Where Data Like '%" + data + "%'" 

날짜 열이 문자열이 아니기 때문에 모든 상황에서 "like"를 사용하면 Oracle이 날짜 값에서 문자열 값으로 변환할 수 있습니다.문자열 값은 연도-월-일-일-일-일-일 또는 일-월-일-일-일-일-일-일-일-일-일-일-일-일-일-일-일-일-일-일-일-일-일-일-일-일-일-일-일-일-일-일-일일 수 있습니다. 이 모든 것은 특정 Oracle 인스턴스가 날짜를 문자열로 표시하도록 매개 변수 NLS_DATE_FORMAT를 설정한

하루에 있을 수 있는 모든 시간을 처리하는 올바른 방법은 다음과 같습니다.

Select * 
From bdPedidos 
Where Data between to_date('" + data + " 00:00:00','yyyy-mm-dd hh24:mi:ss')
               and to_date('" + data + " 23:59:59','yyyy-mm-dd hh24:mi:ss')
SELECT * FROM myTab WHERE startDate like '%-%-2015';

2015년의 모든 날짜를 검색합니다.이 방법이 작동하지 않으면 다음을 시도합니다.

SELECT * FROM myTab WHERE startDate like '%-%-15';

언급URL : https://stackoverflow.com/questions/33151961/oracle-use-like-on-date

반응형