date()

문자열을 지정한 형식에 따라 날짜 타입으로 변환합니다.

문법

date(DATE_EXPR, DATE_FMT[, LOCALE])

매개변수

DATE_EXPR
날짜 타입으로 변환할 문자열 또는 식.
DATE_FMT
자바 SimpleDateFormat 클래스에 정의된 날짜 파싱 형식 문자열. 큰따옴표로 감싼 문자열 상수 또는 미리 바인딩된 쿼리 매개변수만 지정할 수 있으며, 날짜 지시자를 하나 이상 포함해야 합니다. 다음과 같은 날짜 지시자를 사용할 수 있습니다.

날짜 지시자

지시자설명예제
G기원 전/후AD
y달력 기준 연도2025 (yyyy); 25 (yy)
M월July (MMMM); Jul (MMM); 07 (MM), 7 (M)
w연 기준 몇 번째 주27 (해당 연도의 27번째 주)
W월 기준 몇 번째 주2 (해당 월의 두 번째 주)
D연 단위 일10
d월 단위 일189
E요일Tuesday (EEEE); Tue (E, EE, EEE)
F월 기준 몇 번째 요일2 (해당 월의 두 번째 요일)
u요일 숫자(1=월요일, …, 7=일요일)1
a오전/오후PM
H시간(0-23)0
k시간(1-24)24
K오전/오후 시간 (0-11)0
h오전/오후 시간 (1-12)12
m분30
s초55
S밀리초978
z시간대(일반 표기)Pacific Standard Time; PST
Z시간대(RFC 822 표기)-0800
X시간대(ISO 8601 표기)-08;-0800;08:00
LOCALE
ISO 639에 지정된 2자리 또는 3자리 로케일 코드 (기본값: en). 로케일 코드는 ISO 639 코드 목록을 참고하세요.

설명

date() 함수는 문자열을 DATE_FMT에 지정된 형식으로 파싱하여 날짜 타입으로 반환합니다. DATE_EXPR이 null이거나 빈 문자열이면 null을 반환합니다. 파싱에 실패한 경우에도 null을 반환합니다. 배열이나 리스트를 전달하면 각 요소에 대해 재귀적으로 변환을 수행합니다.

로그프레소는 날짜 값의 범위를 엄격하게 검사하지 않습니다. 예를 들어 13월이 입력되면 다음 연도의 1월로 처리하고, 32일이 입력되면 다음 달로 넘어가는 방식으로 계산합니다.

날짜 형식은 쿼리를 파싱하는 시점에 한 번만 컴파일되어 모든 레코드에 재사용됩니다. 따라서 DATE_FMT에는 파싱 시점에 값이 확정되는 문자열만 지정할 수 있습니다. 큰따옴표로 감싼 문자열 상수("yyyy-MM-dd")와, set 명령어·프로시저 인자·워크플로 입력 매개변수로 미리 바인딩된 쿼리 매개변수($() 함수로 참조)를 사용할 수 있습니다. 필드 참조, concat() 같은 함수 호출, 숫자나 산술식을 지정하면 쿼리가 실행되기 전에 오류 코드 90822로 실패합니다. 형식 문자열을 따옴표 없이(yyyy-MM-dd) 또는 작은따옴표('yyyy-MM-dd')로 입력하면 필드 참조로 해석되므로 마찬가지로 90822 오류가 발생합니다. 이 검사는 4.0 계열의 4.0.2609.0 버전부터 적용되며, 5.0 계열(5.0.2605.2까지)에는 아직 적용되지 않았습니다.

날짜 지시자가 하나도 없는 형식 문자열("", "2013")은 어떤 입력에서도 날짜 값을 추출할 수 없으므로 오류 코드 90820으로 거부됩니다. 작은따옴표로 감싼 문자는 리터럴로 취급되어 지시자로 인정되지 않습니다. 예를 들어 "yyyy'년'"은 yyyy가 지시자이므로 유효하지만, "'year'"는 유효하지 않습니다. 이 검사도 4.0 계열의 4.0.2609.0 버전부터 적용되며, 5.0 계열(5.0.2605.2까지)에는 아직 적용되지 않았습니다.

오류 코드

오류 코드설명
90820날짜 형식 문자열이 잘못되었거나 날짜 지시자를 포함하지 않은 경우
90821로케일이 문자열 상수가 아닌 경우
90822날짜 포맷 매개변수가 문자열 상수가 아닌 경우

사용 예

  1. 기본 날짜 문자열 변환

    json "{'val': '2024-06-10 00:30:55.978'}" | eval result = date(val, "yyyy-MM-dd HH:mm:ss.SSS")
    | # result: 2024-06-10 00:30:55+0900
    
  2. ISO 8601 형식 변환

    json "{'val': '2024-01-30T10:11:12.123Z'}" | eval result = date(val, "yyyy-MM-dd'T'HH:mm:ss.SSSX")
    | # result: 2024-01-30 19:11:12+0900
    
  3. 한국어 로케일을 사용한 날짜 변환

    json "{'val': '6월 1 토요일 2024 12:34:56'}" | eval result = date(val, "MMM dd EEEE yyyy HH:mm:ss", "ko")
    | # result: 2024-06-01 12:34:56+0900
    
  4. NULL 입력

    json "{'val': null}" | eval result = date(val, "yyyy-MM-dd")
    | # result: null
    
  5. 쿼리 매개변수로 날짜 형식 지정

    set fmt = "yyyy-MM-dd HH:mm:ss"
    | json "{'val': '2013-06-10 00:30:55'}"
    | eval result = date(val, $("fmt"))
    | # result: 2013-06-10 00:30:55+0900
    

    set 명령어로 미리 바인딩한 쿼리 매개변수는 파싱 시점에 값이 확정되므로 DATE_FMT에 사용할 수 있습니다.

  6. 포맷 매개변수에 문자열 상수가 아닌 값을 지정한 경우 — 파싱 오류

    json "{'val': '2013-06-10 00:30:55'}" | eval result = date(val, 20130610)
    

    숫자(20130610), 산술식(1+1), 필드 참조, concat("yyyy-MM", "-dd") 같은 평가식을 DATE_FMT에 지정하면 쿼리 실행 전에 파싱 오류(오류 코드 90822)가 발생합니다. 오류 안내에는 잘못 입력한 값이 함께 표시되므로 어느 인자를 고쳐야 하는지 바로 확인할 수 있습니다. 위 쿼리는 "date() 함수의 날짜 포맷 매개변수는 문자열 상수만 허용됩니다. (입력값: 20130610)"이라는 안내를 반환합니다.

  7. 날짜 지시자가 없는 포맷을 지정한 경우 — 파싱 오류

    json "{'val': '2013-06-10 00:30:55'}" | eval result = date(val, "2013")
    

    "2013"에는 날짜 지시자가 없어 날짜 값을 추출할 수 없으므로 쿼리 실행 전에 파싱 오류(오류 코드 90820)가 발생합니다.

변경 이력

대상도입 릴리스
date() 함수소나 4.0 이전 버전
포맷 매개변수가 문자열 상수가 아닐 때 파싱 오류(90822)4.0.2609.0 (5.0 계열은 5.0.2605.2까지 미적용)
날짜 지시자가 없는 포맷 문자열에 대한 파싱 오류(90820)4.0.2609.0 (5.0 계열은 5.0.2605.2까지 미적용)