수색…


시간 구성 요소가없는 날짜 생성

모든 DATE 에는 시간 구성 요소가 있습니다. 그러나 시간 정보를 포함 할 필요가없는 날짜는 시간 / 분 / 초를 0으로 설정하여 저장하는 것이 일반적입니다 (예 : 자정).

ANSI DATE 리터럴을 사용합니다 ( ISO 8601 날짜 형식 사용 ).

SELECT DATE '2000-01-01' FROM DUAL;

TO_DATE() 사용하여 문자열 리터럴에서 변환 :

SELECT TO_DATE( '2001-01-01', 'YYYY-MM-DD' ) FROM DUAL;

( 날짜 형식 모델 에 대한 자세한 내용은 Oracle 설명서에서 찾을 수 있습니다.)

또는:

SELECT TO_DATE(
         'January 1, 2000, 00:00 A.M.',
         'Month dd, YYYY, HH12:MI A.M.',
         'NLS_DATE_LANGUAGE = American'
       )
FROM   DUAL;

월 이름과 같은 언어 별 용어를 변환하는 경우 TO_DATE() 함수에 세 번째 nlsparam 매개 변수를 포함시키고 예상되는 언어를 지정하는 것이 좋습니다.

시간 구성 요소로 날짜 생성

TO_DATE() 사용하여 문자열 리터럴에서 변환 :

SELECT TO_DATE( '2000-01-01 12:00:00', 'YYYY-MM-DD HH24:MI:SS' ) FROM DUAL;

또는 TIMESTAMP 리터럴을 사용하십시오.

CREATE TABLE date_table(
  date_value DATE
);

INSERT INTO date_table ( date_value ) VALUES ( TIMESTAMP '2000-01-01 12:00:00' );

오라클은 TIMESTAMP 를 테이블의 DATE 열에 저장할 때 DATE 암시 적으로 캐스팅합니다. 그러나 명시 적으로 값을 DATE CAST() 할 수 있습니다.

SELECT CAST( TIMESTAMP '2000-01-01 12:00:00' AS DATE ) FROM DUAL;

날짜의 형식

Oracle에서 DATE 데이터 유형에는 형식이 없습니다. 오라클이 클라이언트 프로그램 (SQL / Plus, SQL / Developer, Toad, Java, Python 등)에 DATE 를 전송하면 DATE 를 나타내는 7 바이트 또는 8 바이트를 전송합니다.

테이블에 저장되지 않은 DATE ( SYSDATE 의해 생성되고 DUMP() 명령을 사용할 때 "유형 13"을 가짐)은 8 바이트이며 구조가 있습니다 (오른쪽의 숫자는 2012-11-26 16:41:09 의 내부 표현입니다 2012-11-26 16:41:09 ) :

BYTE VALUE                           EXAMPLE
---- ------------------------------- --------------------------------------
1    Year modulo 256                 220
2    Year multiples of 256           7   (7 * 256 + 220 = 2012)
3    Month                           11
4    Day                             26
5    Hours                           16
6    Minutes                         41
7    Seconds                         9
8    Unused                          0

테이블에 저장된 DATE ( DUMP() 명령을 사용할 때 "유형 12")은 7 바이트이며 구조가 있습니다 (오른쪽의 숫자는 2012-11-26 16:41:09 의 내부 표현입니다. ) :

BYTE VALUE                           EXAMPLE
---- ------------------------------- --------------------------------------
1    ( Year multiples of 100 ) + 100 120
2    ( Year modulo 100 ) + 100       112 ((120-100)*100 + (112-100) = 2012)
3    Month                           11
4    Day                             26
5    Hours + 1                       17
6    Minutes + 1                     42
7    Seconds + 1                     10

날짜가 특정 형식을 원하면 형식 (즉, 문자열)이있는 형식으로 변환해야합니다. SQL 클라이언트는이를 암시 적으로 수행하거나 TO_CHAR( date, format_model, nls_params ) 사용하여 값을 명시 적으로 문자열로 변환 할 수 있습니다.

날짜를 문자열로 변환

TO_CHAR( date [, format_model [, nls_params]] ) :

(참고 : 형식 모델 이 제공되지 않으면 NLS_DATE_FORMAT 세션 매개 변수가 기본 형식 모델 로 사용되며 모든 세션마다 다를 수 있으므로 의존해서는 안됩니다. 형식 모델을 항상 지정하는 것이 좋습니다.

CREATE TABLE table_name (
  date_value DATE
);

INSERT INTO table_name ( date_value ) VALUES ( DATE '2000-01-01' );
INSERT INTO table_name ( date_value ) VALUES ( TIMESTAMP '2016-07-21 08:00:00' );
INSERT INTO table_name ( date_value ) VALUES ( SYSDATE );

그때:

SELECT TO_CHAR( date_value, 'YYYY-MM-DD' ) AS formatted_date FROM table_name;

출력 :

FORMATTED_DATE
--------------
2000-01-01
2016-07-21
2016-07-21

과:

SELECT TO_CHAR(
         date_value,
         'FMMonth d yyyy, hh12:mi:ss AM',
         'NLS_DATE_LANGUAGE = French'
       ) AS formatted_date
FROM   table_name;

출력 :

FORMATTED_DATE
-----------------------------
Janvier   01 2000, 12:00:00 AM
Juillet   21 2016, 08:00:00 AM
Juillet   21 2016, 19:08:31 PM

기본 날짜 형식 모델 설정

Oracle이 DATE 에서 문자열로 또는 그 반대로 암시 적으로 변환 할 때 (또는 TO_CHAR() 또는 TO_DATE() 가 명시 적으로 형식 모델없이 호출되는 경우) NLS_DATE_FORMAT 세션 매개 변수가 변환에서 형식 모델로 사용됩니다. 리터럴이 형식 모델과 일치하지 않으면 예외가 발생합니다.

다음을 사용하여이 매개 변수를 검토 할 수 있습니다.

SELECT VALUE FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_DATE_FORMAT';

다음을 사용하여 현재 세션에서이 값을 설정할 수 있습니다.

ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';

(참고 : 다른 사용자의 값은 변경되지 않습니다.)

NLS_DATE_FORMAT 을 사용하여 TO_DATE() 또는 TO_CHAR() 에 형식 마스크를 제공하면이 값이 변경되면 쿼리가 중단 될 때 놀라지 않을 것입니다.

SQL / Plus 또는 SQL Developer가 날짜를 표시하는 방법 변경

SQL / Plus 또는 SQL Developer는 날짜를 표시 할 때 기본 날짜 형식 모델을 사용하여 문자열로의 암시 적 변환을 수행합니다 (기본 날짜 형식 모델 설정 예제 참조).

NLS_DATE_FORMAT 매개 변수를 변경하여 날짜 표시 방법을 변경할 수 있습니다.

날짜 산술 - 일,시, 분 및 / 또는 초 단위 날짜의 차이

오라클에서 두 DATE 사이의 차이 (일 및 / 또는 분수)는 빼기를 사용하여 찾을 수 있습니다.

SELECT DATE '2016-03-23' - DATE '2015-12-25' AS difference FROM DUAL;

두 날짜 사이의 일 수를 출력합니다.

DIFFERENCE
----------
        89

과:

SELECT TO_DATE( '2016-01-02 01:01:12', 'YYYY-MM-DD HH24:MI:SS' )
         - TO_DATE( '2016-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS' )
         AS difference
FROM   DUAL

두 날짜 사이의 일수를 출력합니다.

DIFFERENCE
----------
    1.0425

시간, 분 또는 초의 차이는이 숫자에 24 , 24*60 또는 24*60*60 각각 곱하여 구할 수 있습니다.

이전 예제는 다음을 사용하여 두 날짜 사이의 일,시, 분 및 초를 가져 오도록 변경할 수 있습니다.

SELECT TRUNC( difference                       ) AS days,
       TRUNC( MOD( difference * 24,       24 ) ) AS hours,
       TRUNC( MOD( difference * 24*60,    60 ) ) AS minutes,
       TRUNC( MOD( difference * 24*60*60, 60 ) ) AS seconds
FROM   (
  SELECT TO_DATE( '2016-01-02 01:01:12', 'YYYY-MM-DD HH24:MI:SS' )
         - TO_DATE( '2016-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS' )
         AS difference
  FROM   DUAL

);

(참고 : 마이너스 차이를 올바르게 처리하려면 FLOOR() 대신 TRUNC() 가 사용됩니다.

출력 :

DAYS HOURS MINUTES SECONDS
---- ----- ------- -------
   1     1       1      12

이전 예제는 숫자 차이를 NUMTODSINTERVAL() 사용하여 간격 으로 변환하여 해결할 수도 있습니다.

SELECT EXTRACT( DAY    FROM difference ) AS days,
       EXTRACT( HOUR   FROM difference ) AS hours,
       EXTRACT( MINUTE FROM difference ) AS minutes,
       EXTRACT( SECOND FROM difference ) AS seconds
FROM   (
  SELECT NUMTODSINTERVAL(
           TO_DATE( '2016-01-02 01:01:12', 'YYYY-MM-DD HH24:MI:SS' )
             - TO_DATE( '2016-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS' ),
           'DAY'
         ) AS difference
  FROM   DUAL
);

날짜 산술 - 월 또는 연도의 날짜 차이

두 날짜 간의 월 차이는 MONTHS_BETWEEN( date1, date2 ) 사용하여 MONTHS_BETWEEN( date1, date2 ) 수 있습니다.

SELECT MONTHS_BETWEEN( DATE '2016-03-10', DATE '2015-03-10' ) AS difference FROM DUAL;

출력 :

DIFFERENCE
----------
        12

차이가 부분 개월을 포함하면 매월 31 일을 기준으로 한 월의 분수를 반환합니다.

SELECT MONTHS_BETWEEN( DATE '2015-02-15', DATE '2015-01-01' ) AS difference FROM DUAL;

출력 :

DIFFERENCE
----------
 1.4516129

MONTHS_BETWEEN 으로 인해 한 달에 31 일이 MONTHS_BETWEEN 달에 더 적은 요일이있을 수 있으므로 개월 간 경계에 걸쳐 다른 값이 생길 수 있습니다.

예:

SELECT MONTHS_BETWEEN( DATE'2016-02-01', DATE'2016-02-01' - INTERVAL '1' DAY ) AS "JAN-FEB",
       MONTHS_BETWEEN( DATE'2016-03-01', DATE'2016-03-01' - INTERVAL '1' DAY ) AS "FEB-MAR",
       MONTHS_BETWEEN( DATE'2016-04-01', DATE'2016-04-01' - INTERVAL '1' DAY ) AS "MAR-APR",
       MONTHS_BETWEEN( DATE'2016-05-01', DATE'2016-05-01' - INTERVAL '1' DAY ) AS "APR-MAY"
FROM   DUAL;

산출:

JAN-FEB FEB-MAR MAR-APR APR-MAY
------- ------- ------- -------
0.03226 0.09677 0.03226 0.06452

연도 차이는 월 차이를 12로 나누어 구할 수 있습니다.

년, 월, 일, 시간, 분 또는 초 구성 요소 추출

DATE 데이터 유형의 연도, 월 또는 일 구성 요소는 EXTRACT( [ YEAR | MONTH | DAY ] FROM datevalue ) 사용하여 찾을 수 있습니다.

SELECT EXTRACT (YEAR  FROM DATE '2016-07-25') AS YEAR,
       EXTRACT (MONTH FROM DATE '2016-07-25') AS MONTH,
       EXTRACT (DAY   FROM DATE '2016-07-25') AS DAY
FROM DUAL;

출력 :

YEAR MONTH DAY
---- ----- ---
2016     7  25

시간 (분, 초 또는 초) 구성 요소는 다음 중 하나에서 찾을 수 있습니다.

예 :

SELECT EXTRACT( HOUR   FROM CAST( datetime AS TIMESTAMP ) ) AS Hours,
       EXTRACT( MINUTE FROM CAST( datetime AS TIMESTAMP ) ) AS Minutes,
       EXTRACT( SECOND FROM CAST( datetime AS TIMESTAMP ) ) AS Seconds
FROM   (
  SELECT TO_DATE( '2016-01-01 09:42:01', 'YYYY-MM-DD HH24:MI:SS' ) AS datetime FROM DUAL
);

출력 :

HOURS MINUTES SECONDS
----- ------- -------
    9      42       1

시간대 및 일광 절약 시간

DATE 데이터 형식은 표준 시간대 또는 일광 절약 시간제의 변경을 처리하지 않습니다.

어느 한 쪽:

DATE 는 UTC (Coordinated Universal Time)로 저장하고 다음과 같이 현재 세션 시간대로 변환 할 수 있습니다.

SELECT FROM_TZ(
         CAST(
           TO_DATE( '2016-01-01 12:00:00', 'YYYY-MM-DD HH24:MI:SS' )
           AS TIMESTAMP
         ),
         'UTC'
       )
       AT LOCAL AS time
FROM   DUAL;

ALTER SESSION SET TIME_ZONE = '+01:00'; 을 실행하면 ALTER SESSION SET TIME_ZONE = '+01:00'; 출력은 다음과 같습니다.

TIME
------------------------------------
2016-01-01 13:00:00.000000000 +01:00

그리고 ALTER SESSION SET TIME_ZONE = 'PST'; 출력은 다음과 같습니다.

TIME
------------------------------------
2016-01-01 04:00:00.000000000 PST

도약 시간

Oracle 은 윤초를 처리하지 않습니다 . 자세한 내용은 My Oracle Support note 2019397.2730795.1 을 참조하십시오.

요일 잡기

TO_CHAR( date_value, 'D' ) 날짜 _ 값 TO_CHAR( date_value, 'D' ) 를 사용하여 요일을 가져올 수 있습니다.

그러나 이는 NLS_TERRITORY 세션 매개 변수에 따라 다릅니다.

ALTER SESSION SET NLS_TERRITORY = 'AMERICA';        -- First day of week is Sunday
SELECT TO_CHAR( DATE '1970-01-01', 'D' ) FROM DUAL;

출력 5

ALTER SESSION SET NLS_TERRITORY = 'UNITED KINGDOM'; -- First day of week is Monday
SELECT TO_CHAR( DATE '1970-01-01', 'D' ) FROM DUAL;

출력 4

이 작업을 NLS 설정과 관계없이 수행하려면 다음과 같이 요일을 자르면 (요일을 지우려면) 자르고 현재 iso-week의 시작 부분 (월요일에 시작하는 날)에서 빼는 날짜를 뺍니다.

SELECT TRUNC( date_value ) - TRUNC( date_value, 'IW' ) + 1 FROM DUAL


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow