Oracle 데이터베이스 날짜 추가 및 뺄셈 작업의 일반적인 함정 및 모범 사례
Oracle 날짜 추가 및 뺄셈을위한 암시 적 변환 트랩
Oracle Database에서, 유형 날짜 또는 타임 스탬프 값 (예 : 숫자 추가 또는 빼기) 값에 대한 수학적 작업을 할 때 Oracle은 추가하거나 빼기위한 며칠로 취급합니다. 그러나 TO_DATE 기능이 프로세스에 도입되고 입력 매개 변수가 암시 적으로 변환 된 문자열이거나 형식 모델이 실제 데이터와 일치하지 않으면 특히 연도를 처리 할 때 예상치 못한 결과로 이어질 수 있습니다.
원래 질문에서 SQL 문은 다음과 같습니다.
cus_logs set start_date = to_date (Systimestamp 3, 'dd-mon-rrrrr'), end_date = to_date (systimestamp 21921, 'dd-mon-rrrr') 여기서 cus_id in ( '9B90CB8175BA0CA60175BA12D8711006');
여기서 핵심 문제는 to_date (Systimestamp n, 'dd-mon-rrrr')입니다. 우리의 의도는 Systimestamp에 직접 일을 추가하는 것이지만, To_date 기능 Oracle은 추가를 수행 한 후 Systimestamp N (타임 스탬프 유형)의 결과를 스트링으로 암시 적으로 변환 한 다음 'DD-Mon-RRRRR'형식 모델을 사용하여 날짜 유형으로 다시 변환하도록합니다.
이 암시 적 변환 프로세스는 현재 세션의 NLS_DATE_FORMAT 매개 변수의 영향을받습니다. nls_date_format가 dd-mon-rr 또는 dd-mon-yy로 설정된 경우, 연도 부분에는 암시 적으로 문자열로 변환 될 때 두 자리 만 포함 할 수 있습니다. 예를 들어, 2082-11-08은 암시 적으로 '08 -nov-82 '로 변환 될 수 있습니다. TO_DATE 기능이 'DD-Mon-RRRR'형식 모델로 '08 -Nov-82 '를 현재로 변환하려고 시도 할 때, RRR 형식 모델은 2 비트 년 82 년을 1982 년으로 해석합니다 (RR 형식은 00-49를 20xx로 해석하고, 50-99로, RRRR을 사용하기 때문에) 1 년 오류.
다음 예제는 암시 적 변환에 대한 NLS_DATE_Format의 효과를 보여줍니다. 현재 날짜가 2022-11-02라고 가정합니다.
-세션의 날짜 형식을 DD-Mon-RR로 설정하고 문제를 일으킬 수있는 환경을 시뮬레이션합니다. 세션 세션 설정 NLS_DATE_FORMAT = 'DD-MON-RR'; 선택하다 to_date (sysdate 3, 'dd-mon-rrrr') "A (2022 3 일)", to_char (to_date (sysdate 3, 'dd-mon-rrrr'), 'yyyy-mm-dd')는 "b (yyyy format of a)," to_date (Sysdate 21921, 'dd-mon-rrrr')는 "C (2022 21921 Days)", to_char (to_date (sysdate 21921, 'dd-mon-rrrr'), 'yyyy-mm-dd'), "d (yyyy c)의 c), to_date (Sysdate 3, 'dd-mon-yyyy') "E (2022 3 일, yyyy)", to_char (to_date (sysdate 3, 'dd-mon-yyyy'), 'yyyy-mm-dd')는 "f (yyyy format of e)", to_date (sysdate 21921, 'dd-mon-yyyy')는 "G (2022 21921 일, yyyy)", to_char (to_date (sysdate 21921, 'dd-mon-yyyy'), 'yyyy-mm-dd')는 "h (yyyy 형식의 g)" 이중에서;
위의 쿼리를 실행하면 다음과 유사한 결과를 관찰합니다 (특정 날짜는 실행 날짜에 따라 다름).
A (2022 3 일) | B (yyyy 형식의 A) | C (2022 21921 일) | d (yyyy c) | E (2022 3 일, yyyy) | f (yyyy 형식의 e) | G (2022 21921 일, Yyyy) | H (yyyy 형식의 G) |
---|---|---|---|---|---|---|---|
05-Nov-22 | 2022-11-05 | 08-NOV-82 | 1982-11-08 | 05-Nov-22 | 0022-11-05 | 08-NOV-82 | 0082-11-08 |
결과에서, 우리는 계산 결과가 2082-11-08 일 때, 82는 1982 년에 2 비트 연도 '08 -nov-82 '로 암시 적으로 변환 된 다음 to_date (...,'dd-mon-rrrrr ')에 의해 구문 분석되기 때문에 오해된다는 것을 알 수 있습니다. DD-Mon-Yyyy가 사용되는 경우, 2 자리 82 년은 0082로 해석되며, 이는 훨씬 더 이성적입니다.
올바른 날짜 추가 및 빼기 작업
Oracle Database 자체는 날짜 및 타임 스탬프 유형에 숫자를 추가하고 빼서 날짜를 직접 조정하기 위해 숫자 추가 및 빼기를 지원합니다. 숫자는 하루를 나타냅니다. 따라서 날짜 또는 타임 스탬프를 지정된 날로 늘리려면 가장 직접적이고 안전한 방법은 불필요한 TO_DATE 또는 TO_CHAR 변환을 피하는 것입니다.
Systimestamp 또는 Sysdate를 사용하여 직접 일수를 추가하거나 빼십시오.
SYSTIMESTAMP 현재 시스템 날짜와 시간 (시간대 포함)을 반환하고 SYSDATE는 현재 시스템 날짜와 시간을 반환합니다 (시간대 제외, 정확도는 초). 둘 다 숫자와 함께 직접 추가 및 빼낼 수 있습니다.
-예 : 직접 추가 및 SUTSIMESTAMP를 추가 및 빼기-NLS_TIMESTAMP_TZ_FORMAT를 먼저 설정하는 것이 좋습니다. 타임 스탬프 결과를 명확하게 표시하는 세션 세션 설정 NLS_TIMESTAMP_TZ_FORMAT = 'YYYY-MM-DD HH24 : MI : SS TZR'; ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD'; 선택하다 "현재 타임 스탬프"로 Systimestamp, "3 일 후 타임 스탬프"로 Systimestamp 3, Systimestamp 21921 "21921 일 타임 스탬프" 이중에서;
결과는 올바른 미래 날짜를 명확하게 보여줄 것입니다.
현재 타임 스탬프 | 3 일 후에 타임 스탬프 | 21921 일 후 타임 스탬프 |
---|---|---|
2022-11-02 10:42:24 00:00 | 2022-11-05 10:42:24 00:00 | 2082-11-08 10:42:24 00:00 |
날짜 부분 만 필요하거나 대상 열이 날짜 유형 인 경우 SysDate를 사용하는 것이 더 간결합니다.
- 예 : sysdate에 직접 추가 및 빼기 "현재 날짜"로 sysdate, "3 일 후 날짜"로 Sysdate 3, "21921 일 이후의 날짜"로 Sysdate 21921 이중에서;
결과도 정확합니다.
현재 날짜 | 3 일 후 | 21921 일 후 |
---|---|---|
2022-11-02 | 2022-11-05 | 2082-11-08 |
시간 부분 제거 : trunc () 사용
계산의 날짜 부분이 하루의 자정부터 시작하도록하려면 (00:00:00) Trunc () 함수를 사용하여 시간 부분을 잘릴 수 있습니다. Trunc (Sysdate)은 Sysdate의 시간 부분을 자정으로 설정합니다.
- 예 : trunc ()를 사용하여 Select가 하루 자정부터 계산되도록하십시오. Trunc (Sysdate)로 "자정의 자정", Trunc (Sysdate) 3 "3 일 만에 자정", Trunc (Sysdate) 21921 "자정 이후 21921 일" 이중에서;
예를 들어 날짜 일관성을 보장하는 데 유용합니다. 예를 들어, 특정 시점이 아닌 날짜에만 관심이있는 경우.
최종 솔루션
위의 분석에 따르면, 원래 업데이트 문은 날짜 산술을 직접 수행하도록 수정하고 Trunc ()를 사용하여 시간 부분이 자정부터 시작되도록하는 옵션을 수정해야합니다.
CUS_LOGS SET을 업데이트하십시오 start_date = trunc (sysdate) 3, end_date = trunc (sysdate) 21921 여기서 cus_id in ( '9B90CB8175BA0CA60175BA12D8711006');
이 SQL 문은 암시 적 변환 문제를 일으킬 수있는 TO_DATE 호출을 피하고 날짜 유형을 추가하고 빼기위한 Oracle의 내장 지원을 직접 활용하여 계산의 정확성을 보장합니다.
추가 날짜 조작 고려 사항
숫자의 직접 추가 및 뺄셈은 며칠 동안 적합하지만 Oracle은 몇 달 또는 몇 년을 추가하고 빼기위한 특수 기능을 제공합니다.
- add_months (날짜, 정수) : 지정된 날짜에 한 달을 늘리거나 줄이는 데 사용됩니다. 예를 들어, add_months (trunc (sysdate), 60*12)는 날짜를 60 년 씩 증가시킬 수 있습니다. ADD_MONTHS는 월말 날짜를 처리 할 것입니다. 예를 들어 1 개월에 1 월 31 일을 추가하면 2 월 28 일 (또는 29)가됩니다.
- 간격 문자 : 시간 간격은 SysDate 간격 '3'일 또는 Systimestamp 간격 '1'연도와 같이 더 명확하게 표현할 수 있습니다. 그러나 연도 간격 유형은 2 월 29 일을 도약 연도에 걸쳐 처리 할 때 오류가 발생할 수 있습니다. 예를 들어, 날짜 '2020-02-29'간격 '1'연도는 2021 년 2 월 29 일이 없기 때문에 잘못된 날짜 오류가 발생합니다.
날짜 조작 방법을 선택할 때 가장 직접적이고 암시적인 전환이 우선 순위를 부여해야합니다. 일을 추가하거나 빼기 위해서는 날짜 또는 타임 스탬프 유형의 값에 직접 숫자를 추가하거나 빼는 것이 가장 좋습니다.
요약
Oracle 데이터베이스에서 날짜 추가 및 뺄셈 작업을 수행 할 때는 특히 TO_DATE 기능 및 2 비트 연도 형식 모델 (예 : RR)과 관련하여 암시 적 변환 및 NLS_DATE_Format 매개 변수가 가져올 수있는 함정에주의를 기울여야합니다. 모범 사례는 다음과 같습니다.
- 불필요한 TO_DATE 또는 TO_CHAR 변환을 피하십시오 : 날짜 또는 타임 스탬프 유형의 값의 일수를 늘리거나 줄여야 할 때 직접 추가하거나 빼십시오.
- trunc () 함수 사용 : 날짜까지 자정까지의 시간 부분을 재설정 해야하는 경우 (00:00:00) Trunc (날짜)를 사용하십시오.
- NLS 매개 변수의 영향 이해 : 세션의 NLS_DATE_FORMAT 설정이 잠재적 문제를 진단하는 데 도움이되는 날짜 및 타임 스탬프의 암시 적 문자열 변환에 어떤 영향을 미치는지 이해합니다.
- 적절한 기능을 선택하십시오 : 날 (예 : 몇 달 또는 몇 년) 이외의 날짜 작업의 경우 Add_months와 같은 특수 기능을 사용하고 행동 특성에주의하십시오.
이러한 원칙에 따라 Oracle 날짜 운영이 정확하고 날짜 계산 오류로 인한 비즈니스 문제를 피할 수 있습니다.
위 내용은 Oracle 데이터베이스 날짜 추가 및 뺄셈 작업의 일반적인 함정 및 모범 사례의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undress AI Tool
무료로 이미지를 벗다

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

가상 스레드는 동시성과 IO 집약적 시나리오에서 상당한 성능 이점을 가지고 있지만 테스트 방법과 해당 시나리오에주의를 기울여야합니다. 1. 정확한 테스트는 실제 비즈니스, 특히 IO 차단 시나리오를 시뮬레이션하고 JMH 또는 Gatling과 같은 도구를 사용하여 플랫폼 스레드를 비교해야합니다. 2. 처리량 간격은 분명하며, 일정이 가볍고 효율적이기 때문에 10 만 동시 요청보다 여러 배에서 10 배나 높을 수 있습니다. 3. 테스트 중에, 높은 동시성 수치를 맹목적으로 추구하고, 비 차단 IO 모델에 적응하고, 대기 시간 및 GC와 같은 모니터링 지표에주의를 기울일 필요가있다. 4. 실제 애플리케이션에서는 웹 백엔드, 비동기 작업 처리 및 많은 동시 IO 시나리오에 적합하지만 CPU 집약적 작업은 플랫폼 스레드 또는 포크 플랫폼에 여전히 적합합니다.

TOSETJAVA_HOMEONWINDOWS, FIRSTLOCATETEJDKINSTALLATIONPATH (예 : C : \ ProgramFiles \ java \ jdk-17), thencreateasystemenvaria blenamedjava_homewiththatpath.next, updatePathVariableByadding%java \ _home%\ bin, andverifythesetupusingjava-versionandjavac-v

JDBC 트랜잭션을 올바르게 처리하려면 먼저 자동 커밋 모드를 끄고 여러 작업을 수행 한 다음 결과에 따라 커밋 또는 롤백을 수행해야합니다. 1. 트랜잭션을 시작하려면 Conn.SetAutoCommit (False)에게 전화하십시오. 2. 인서트 및 업데이트와 같은 여러 SQL 작업을 실행합니다. 3. 모든 작업이 성공한 경우 Conn.commit ()에게 전화하여 데이터 일관성을 보장하기 위해 예외가 발생하면 Conn.Rollback ()에게 전화하십시오. 동시에, 재 시도는 리소스를 관리하고, 예외를 올바르게 처리하고, 연결 유출을 피하기 위해 긴밀한 연결을 사용하는 데 사용해야합니다. 또한 연결 풀을 사용하고 부분적으로 롤백을 달성하기 위해 저장 포인트를 설정하고 성능을 향상시키기 위해 거래를 가능한 한 짧게 유지하는 것이 좋습니다.

링크 된 목록을 구현하기위한 핵심은 노드 클래스를 정의하고 기본 작업을 구현하는 것입니다. first 데이터 및 다음 노드에 대한 참조를 포함하여 노드 클래스를 만듭니다. linkedlist 클래스를 생성하여 삽입, 삭제 및 인쇄 기능을 구현합니다. hepend 메소드는 꼬리에 노드를 추가하는 데 사용됩니다. printList 메소드는 링크 된 목록의 내용을 출력하는 데 사용됩니다. deletewithValue 메소드는 지정된 값으로 노드를 삭제하고 헤드 노드와 중간 노드의 다른 상황을 처리하는 데 사용됩니다.

Servicemesh는 Java Microservice Architecture의 진화를위한 불가피한 선택이며, 그 핵심은 네트워크 논리 및 비즈니스 코드를 분리하는 데 있습니다. 1. Servicemesh는 부하 밸런싱, 퓨즈, 모니터링 및 기타 기능을 부상 에이전트를 통해 처리하여 비즈니스에 중점을 둡니다. 2. Istio Envoy는 중간 및 대형 프로젝트에 적합하며 Linkerd는 가볍고 소규모 시험에 적합합니다. 3. Java 마이크로 서비스는 Feign, Ribbon 및 기타 구성 요소를 닫고 발견 및 의사 소통을 위해 Istiod로 넘겨야합니다. 4. 배치 중 사이드카의 자동 주입을 보장하고 트래픽 규칙 구성, 프로토콜 호환성 및 로그 추적 시스템 구성에주의를 기울이고 점진적인 마이그레이션 및 사전 제어 모니터링 계획을 채택하십시오.

Java Collection Framework의 성능을 향상시키기 위해 다음 4 가지 점에서 최적화 할 수 있습니다. 1. Arraylist에 대한 자주 임의의 액세스, 해시 세트에 대한 빠른 검색 및 동의 환경에 대한 동의어 맵과 같은 시나리오에 따라 적절한 유형을 선택하십시오. 2. 용량 확장 오버 헤드를 줄이지 만 메모리 폐기물을 피하기 위해 초기화 중에 용량 및로드 계수를 합리적으로 설정하십시오. 3. 불변의 세트 (예 : List.of ())를 사용하여 보안 및 성능을 향상 시키며 일정한 또는 읽기 전용 데이터에 적합합니다. 4. 메모리 누출을 방지하고 약한 참조 또는 전문 캐시 라이브러리를 사용하여 장기 생존 세트를 관리합니다. 이러한 세부 사항은 프로그램 안정성과 효율성에 큰 영향을 미칩니다.

Pre-FormancetArtUptimeMoryUsage, Quarkusandmicronautleadduetocompile-timeprocessingandgraalvsupport, withquarkusoftenperforminglightbetterine serverless sinarios.2.thyvelopecosyste,

setupamaven/gradleProjectwithJax-rsddependencies likejersey; 2. createarestresourceUsingAnnotationsSuchas@pathand@get;
