DATEDIFF

DATEDIFF (날짜/시간 차이)

요청한 날짜 또는 시간 부분을 기준으로 두 date, time, timestamp 표현식 사이의 차이를 계산해요. 이 함수는 두 번째 인자를 세 번째 인자에서 뺀 결과를 반환해요.

참고: 차이 계산은 완전한 날짜나 시간이 아니라 지정한 날짜 또는 시간 부분을 비교해요. 예를 들어 2024년 11월 28일과 2024년 12월 5일 사이의 월(month) 차이는 1인데, 두 달(11월과 12월, 모두 2024년)의 차이가 1이기 때문이에요. 두 날짜의 차이가 한 달 미만이라는 사실을 반영하려면 그 대신 일(day) 단위로 차이를 계산해요.

날짜 사이의 차이를 계산할 때 빼기 기호(-)를 사용해서 한 날짜에서 다른 날짜를 뺄 수도 있어요.

date, time, timestamp에 시간 단위를 더하려면(예: 날짜에 이틀을 더함) 또는 시간 단위를 빼려면 DATEADD, TIMEADD, TIMESTAMPADD 함수를 사용할 수 있어요.

참조: TIMEDIFF, TIMESTAMPDIFF

출처: Snowflake SQL Reference - DATEDIFF

본문

구문

DATEDIFF:

DATEDIFF( <date_or_time_part>, <date_or_time_expr1>, <date_or_time_expr2> )

빼기 기호:

<date_expr2> - <date_expr1>

인자

DATEDIFF:

date_or_time_part

시간의 단위예요. 지원되는 날짜 및 시간 부분에 나열된 값 중 하나여야 해요(예: month). 값은 문자열 리터럴이거나 따옴표가 없을 수 있어요(예: 'month' 또는 month).

date_or_time_expr1, date_or_time_expr2

비교할 값들이에요. date, time, timestamp이거나 date/time/timestamp로 평가될 수 있는 표현식이어야 해요. date_or_time_expr1 값은 date_or_time_expr2에서 빼져요.

빼기 기호:

date_expr1, date_expr2

비교할 값들이에요. date 또는 date로 평가될 수 있는 표현식이어야 해요. date_expr1 값은 date_expr2에서 빼져요.

반환 값

DATEDIFF:

date_or_time_expr2와 date_or_time_expr1 사이의 단위 수(초, 일 등) 차이를 나타내는 정수를 반환해요.

어떤 인자가 NULL이면 NULL을 반환해요.

빼기 기호:

date_expr2와 date_expr1 사이의 일(day) 수 차이를 나타내는 정수를 반환해요. (단위는 항상 일이에요.)

date_expr2 또는 date_expr1이 NULL이면 오류를 반환해요.

사용상 주의사항

DATEDIFF와 빼기 기호 모두:

  • 출력 값은 음수일 수 있어요(예: -12일).

DATEDIFF:

  • 이 함수는 years, quarters, months, weeks, days, hours, minutes, seconds, milliseconds, microseconds, nanoseconds 단위를 지원해요.
  • date_or_time_part가 week(또는 그 변형)면 출력은 WEEK_START 세션 파라미터에 의해 제어돼요. 예시를 포함한 자세한 내용은 Calendar weeks and weekdays를 참고해요.
  • 차이를 계산하는 데 사용되는 단위(예: month)는 DATE, TIME, TIMESTAMP 필드의 어떤 부분이 평가되는지를 결정해요. 따라서 단위가 결과의 정밀도를 결정해요. 더 작은 단위는 사용되지 않으므로 값은 반올림되지 않아요. 예를 들어 2021년 1월 1일과 2021년 2월 28일 사이의 차이가 두 달보다는 한 달에 가깝더라도 다음은 한 달을 반환해요:
    DATEDIFF(month, '2021-01-01'::DATE, '2021-02-28'::DATE)
    
  • DATE 값의 경우:
    • year는 연도만 사용하고 다른 모든 부분은 무시해요.
    • month는 월과 연도를 사용해요.
    • day는 전체 날짜를 사용해요.
  • TIME 값의 경우:
    • hour는 시만 사용하고 다른 모든 부분은 무시해요.
    • minute는 시와 분을 사용해요.
    • second는 시, 분, 초를 사용하지만 소수부 초는 사용하지 않아요.
    • millisecond는 시, 분, 초와 소수부 초의 첫 세 자리를 사용해요. 소수부 초는 반올림되지 않아요. 예를 들어 DATEDIFF(milliseconds, '2024-02-20 21:18:41.0000', '2024-02-20 21:18:42.1239')는 1.124초가 아니라 1.123초를 반환해요.
    • microsecond는 시, 분, 초와 소수부 초의 첫 여섯 자리를 사용해요. 소수부 초는 반올림되지 않아요.
    • nanosecond는 시, 분, 초와 소수부 초의 아홉 자리 모두를 사용해요.
  • TIMESTAMP 값의 경우:
    • 규칙은 위의 DATE와 TIME 데이터 타입 규칙과 동일해요. 지정된 단위와 그보다 큰 단위만 사용돼요.

빼기 기호:

  • date_expr1과 date_expr2는 둘 다 날짜여야 해요. time과 timestamp는 허용되지 않아요.

예시

두 timestamp 사이의 연(년) 차이 계산:

SELECT DATEDIFF(year, '2020-04-09 14:39:20'::TIMESTAMP,
                     '2023-05-08 23:39:20'::TIMESTAMP) AS diff_years;
+------------+
| DIFF_YEARS |
|------------|
|          3 |
+------------+

두 timestamp 사이의 시(시간) 차이 계산:

SELECT DATEDIFF(hour, '2023-05-08T23:39:20.123-07:00'::TIMESTAMP,
               DATEADD(year, 2, ('2023-05-08T23:39:20.123-07:00')::TIMESTAMP))
  AS diff_hours;
+------------+
| DIFF_HOURS |
|------------|
|      17544 |
+------------+

date 부분이 DATEDIFF 계산에 미치는 영향을 보여주고, 날짜 뺄셈에 빼기 기호 사용을 시연:

SELECT column1 date_1, column2 date_2,
       DATEDIFF(year, column1, column2) diff_years,
       DATEDIFF(month, column1, column2) diff_months,
       DATEDIFF(day, column1, column2) diff_days,
       column2::DATE - column1::DATE AS diff_days_via_minus
  FROM VALUES
       ('2015-12-30', '2015-12-31'),
       ('2015-12-31', '2016-01-01'),
       ('2016-01-01', '2017-12-31'),
       ('2016-08-23', '2016-09-07');
+------------+------------+------------+-------------+-----------+---------------------+
| DATE_1     | DATE_2     | DIFF_YEARS | DIFF_MONTHS | DIFF_DAYS | DIFF_DAYS_VIA_MINUS |
|------------+------------+------------+-------------+-----------+---------------------|
| 2015-12-30 | 2015-12-31 |          0 |           0 |         1 |                   1 |
| 2015-12-31 | 2016-01-01 |          1 |           1 |         1 |                   1 |
| 2016-01-01 | 2017-12-31 |          1 |          23 |       730 |                 730 |
| 2016-08-23 | 2016-09-07 |          0 |           1 |        15 |                  15 |
+------------+------------+------------+-------------+-----------+---------------------+

time 부분이 DATEDIFF 계산에 미치는 영향을 시연:

ALTER SESSION SET TIMESTAMP_NTZ_OUTPUT_FORMAT = 'DY, DD MON YYYY HH24:MI:SS';
SELECT column1 timestamp_1, column2 timestamp_2,
       DATEDIFF(hour, column1, column2) diff_hours,
       DATEDIFF(minute, column1, column2) diff_minutes,
       DATEDIFF(second, column1, column2) diff_seconds
  FROM VALUES
       ('2016-01-01 01:59:59'::TIMESTAMP, '2016-01-01 02:00:00'::TIMESTAMP),
       ('2016-01-01 01:00:00'::TIMESTAMP, '2016-01-01 01:59:00'::TIMESTAMP),
       ('2016-01-01 01:00:59'::TIMESTAMP, '2016-01-01 02:00:00'::TIMESTAMP);
+---------------------------+---------------------------+------------+--------------+--------------+
| TIMESTAMP_1               | TIMESTAMP_2               | DIFF_HOURS | DIFF_MINUTES | DIFF_SECONDS |
|---------------------------+---------------------------+------------+--------------+--------------|
| Fri, 01 Jan 2016 01:59:59 | Fri, 01 Jan 2016 02:00:00 |          1 |            1 |            1 |
| Fri, 01 Jan 2016 01:00:00 | Fri, 01 Jan 2016 01:59:00 |          0 |           59 |         3540 |
| Fri, 01 Jan 2016 01:00:59 | Fri, 01 Jan 2016 02:00:00 |          1 |           60 |         3541 |
+---------------------------+---------------------------+------------+--------------+--------------+

CURRENT_TIMESTAMP 함수를 DATEDIFF 함수와 함께 사용해 지정한 timestamp와 현재 timestamp 사이의 연, 월, 일 차이를 계산:

SELECT column1 specified_timestamp,
       column2 timestamp_now,
       DATEDIFF(year, column1, column2) diff_years,
       DATEDIFF(month, column1, column2) diff_months,
       DATEDIFF(day, column1, column2) diff_days,
       column2::DATE - column1::DATE AS diff_days_via_minus
  FROM VALUES ('2012-08-23 09:00:00.000 -0700', CURRENT_TIMESTAMP);
+-------------------------------+-------------------------------+------------+-------------+-----------+---------------------+
| SPECIFIED_TIMESTAMP           | TIMESTAMP_NOW                 | DIFF_YEARS | DIFF_MONTHS | DIFF_DAYS | DIFF_DAYS_VIA_MINUS |
|-------------------------------+-------------------------------+------------+-------------+-----------+---------------------|
| 2012-08-23 09:00:00.000 -0700 | 2024-09-04 17:21:12.189 -0700 |         12 |         145 |      4395 |                4395 |
+-------------------------------+-------------------------------+------------+-------------+-----------+---------------------+

더 알아보기