programing

Oracle: 자정 전 현재 날짜(오늘)를 선택하는 방법은 무엇입니까?

telecom 2023. 7. 29. 08:11
반응형

Oracle: 자정 전 현재 날짜(오늘)를 선택하는 방법은 무엇입니까?

Oracle을 사용하여 현재 날짜(예: SYSDATE)를 11:59:59로 선택하는 방법은 무엇입니까?

자정의 정의가 약간 모호할 수 있다는 점을 고려하십시오(한밤의 목요일은 목요일과 금요일 또는 수요일과 목요일을 가로지르는 것을 의미합니까?).

자정 전(1초 전) 현재 날짜(오늘)를 선택하려면 다음 문 중 하나를 사용할 수 있습니다.

SELECT TRUNC(SYSDATE + 1) - 1/(24*60*60) FROM DUAL
SELECT TRUNC(SYSDATE + 1) - INTERVAL '1' SECOND FROM DUAL;

기능:

  1. 하루를 합하면 다음과 같습니다.SYSDATE:SYSDATE + 1이제 날짜는 내일입니다.
  2. 날짜의 시간 부분 제거TRUNC이제 날짜는 내일 00:00입니다.
  3. 날짜에서 1초 빼기:- 1/(24*60*60)또는- INTERVAL '1' SECOND FROM DUAL이제 날짜는 오늘 11:59:59입니다.

참고 1: 날짜 간격을 확인하려면 아래의 @Allan 답변을 확인하십시오.

참고 2: 다른 하나를 사용할 수도 있습니다(읽는 것이 더 쉽습니다).

SELECT TRUNC(SYSDATE) + INTERVAL '23:59:59'  HOUR TO SECOND FROM DUAL;
  1. 현재 날짜의 시간 부분을 제거합니다.TRUNC이제 날짜는 오늘 00:00입니다.
  2. 시간 간격 추가23:59:59이제 날짜는 오늘 11:59:59입니다.

참고 3: 결과를 확인하려면 형식을 추가해야 합니다.

SELECT TO_CHAR(TRUNC(SYSDATE + 1) - 1/(24*60*60),'yyyy/mm/dd hh24:mi:ss') FROM DUAL
SELECT TO_CHAR(TRUNC(SYSDATE + 1) - INTERVAL '1' SECOND,'yyyy/mm/dd hh24:mi:ss') FROM DUAL
SELECT TO_CHAR(TRUNC(SYSDATE) + INTERVAL '23:59:59','yyyy/mm/dd hh24:mi:ss') FROM DUAL

개인적으로, 저는 자정 전에 1초를 사용하는 것을 싫어합니다.다른 것들 중에서도, 만약 당신이 그것을 사용한다면.timestamp비교하는 값이 공백 사이에 있을 수 있습니다(예: 23:59:59.1).이러한 종류의 논리는 일반적으로 범위 조건에 대한 경계로 사용되므로 가능하면 "자정 전 1초 이하"보다는 "자정 미만"을 사용하는 것이 좋습니다.이를 위한 구문도 단순화됩니다.예를 들어, "오늘"을 나타내는 시간 범위를 가져오려면 다음 중 하나를 사용할 수 있습니다.

date_value >= trunc(sysdate) and date_value < trunc(sysdate) + 1
date_value >= trunc(sysdate) and date_value < trunc(sysdate) + interval '1' day

사용하는 것보다 조금 더 번거롭습니다.between하지만 고려하고 있는 범위를 벗어나는 값은 절대로 얻을 수 없습니다.

진짜 모호성은 아마도 윤초와 일광 절약일 것입니다(하지만 자정에 바뀌는 경우가 있는지는 모르겠습니다).

어쨌든, 일반적인 경우에는 다음과 같은 해결책이 거의 없습니다.

-- all of these will produce a `DATE` result:
SELECT TRUNC(SYSDATE+1)-1/86400 FROM DUAL;
SELECT TRUNC(SYSDATE+1) - INTERVAL '1' SECOND FROM DUAL;
SELECT TRUNC(SYSDATE) + INTERVAL '23:59:59'  HOUR TO SECOND FROM DUAL;

타임스탬프를 사용하는 경우 몇 가지 이상한 점이 있습니다.

  • TRUNC자동으로 값을 변환합니다.DATE;
  • a 추가/ 빼기NUMBER에/에서TIMESTAMP을 생산할 것입니다.DATE자세한 내용은 날짜/구간 산술을 참조하십시오.
-- those two will produce a `DATE` *too*, not a `TIMESTAMP`:
SELECT TRUNC(SYSTIMESTAMP) + INTERVAL '23:59:59'  HOUR TO SECOND FROM DUAL;

SELECT TO_TIMESTAMP(TRUNC(SYSTIMESTAMP+1))-1/86400 FROM DUAL;

언급URL : https://stackoverflow.com/questions/26182524/oracle-how-to-select-current-date-today-before-midnight

반응형