HOWTO · SQLite
SQLite의 형식으로 문자열 날짜 변환
이 자습서에서는 SQLite에서 형식으로 문자열 날짜를 변환하는 방법에 대해 설명합니다.
이 페이지의 내용
SQLite에는 전용 날짜 저장 형식이 없습니다. 애플리케이션은 날짜를 텍스트, 율리우스력 일수 또는 Unix 타임스탬프로 저장하는 경우가 많습니다. SQLite의 날짜 및 시간 함수는 지원되는 시간 값만 해석하며, 날짜처럼 보이는 모든 문자열을 자동으로 인식하지는 않습니다. 문자열 날짜의 형식을 지정하려면 먼저 SQLite가 인식하는 입력 형식인지 확인한 다음 원하는 출력 패턴을 선택하세요.
아래 예제는 SQLite SQL을 사용합니다. strftime()는 인식 가능한 시간 값을 텍스트로 형식화할 뿐, 테이블에 저장된 값을 영구적으로 바꾸지는 않습니다. 원본이 MM-DD-YYYY와 같은 사용자 지정 형식이라면 날짜 비교나 계산에 사용하기 전에 명시적으로 변환하세요.
SQLite가 날짜 및 시간 값을 해석하는 방식
SQLite 날짜 및 시간 함수는 일반적인 ISO-8601 텍스트 형식, 율리우스력 일수, 적절한 수정자와 함께 사용하는 Unix 타임스탬프 등 지원되는 시간 값을 받습니다. 텍스트 열에는 어떤 문자든 들어갈 수 있으므로, 값을 event_date라는 열에 저장해도 SQLite가 그 값을 해석할 수 있다는 보장은 없습니다. 데이터 원본을 관리할 수 있다면 입력 형식을 일관되게 유지하세요.
형식화와 파싱은 서로 관련은 있지만 별개의 작업입니다. strftime()는 형식 문자열과 시간 값을 차례로 받아, 해당 값을 이해할 수 있으면 형식이 적용된 텍스트를 반환합니다. 입력을 해석할 수 없으면 결과는 NULL입니다. 모든 행이 변환되었다고 가정하지 말고 이 결과를 명시적으로 확인하세요.
지원되는 날짜 문자열을 strftime()로 형식화하기
지원되는 ISO 날짜를 입력으로 사용하고 출력 패턴은 %Y-%m-%d로 지정하세요. %Y는 네 자리 연도, %m은 두 자리 월, %d는 두 자리 일을 뜻합니다. 출력 패턴은 구두점도 정하므로 이 예제에서는 하이픈을 사용합니다.
다음은 바로 실행할 수 있는 Python 예제입니다. 이 예제는 SQL 쿼리를 SQLite에 전달하고 반환된 값을 출력합니다.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
import sqlite3
connection = sqlite3.connect(":memory:")
value = connection.execute(
"SELECT strftime('%Y-%m-%d', '2022-12-31')"
).fetchone()[0]
print(value)
connection.close()
2022-12-31
이에 해당하는 SQL 표현식은 SELECT strftime('%Y-%m-%d', '2022-12-31');입니다. 쿼리에서 결과는 텍스트로 반환되므로 표시하거나 내보내기에 편리합니다. 시간 순서에 따른 비교에는 YYYY-MM-DD처럼 정렬 가능한 표현을 일관되게 사용하거나, 서로 다른 텍스트 형식을 섞는 대신 SQLite의 날짜 및 시간 함수를 통해 값을 비교하세요.
테이블에 저장된 날짜 값 형식화하기
열의 값이 지원되는 입력 형식이라면 같은 함수를 열에 적용할 수 있습니다. events에 event_date = '2022-12-31'인 입력 행이 있다고 가정해 보겠습니다. 다음 SQLite 쿼리는 날짜를 일/월/연도 순으로 형식화합니다. SELECT event_date, strftime('%d/%m/%Y', event_date) AS formatted_date FROM events;. 이에 해당하는 결과 행은 2022-12-31 | 31/12/2022입니다. 이 쿼리는 행마다 형식화된 값을 하나씩 반환하며 저장된 열을 갱신하지 않습니다. 저장된 데이터를 의도적으로 바꾸려는 경우에만 UPDATE를 사용하고, 실행 전에 백업을 보관하세요.
입력에 관한 전제가 중요합니다. 행에 다른 형식이나 관련 없는 텍스트가 있으면 해당 행의 형식화 결과가 NULL일 수 있습니다. 데이터를 정리할 때 원본 열과 형식화 결과를 함께 선택하면 값을 변경하거나 내보내기 전에 별도 처리가 필요한 항목을 찾을 수 있습니다.
여러 입력 형식을 안전하게 처리하기
열에 형식이 여러 개 섞여 있다면 가져오기 유형이나 별도의 source_format 열처럼 신뢰할 수 있는 원본 규칙을 사용해 각 형식을 식별하세요. 슬래시나 하이픈만 보고 날짜 규칙을 추측하지 마세요. 03/04/2024는 3월 4일일 수도 있고 4월 3일일 수도 있습니다. 구분자를 바꾸는 것만으로는 월, 일, 연도 순서를 바꿀 수 없습니다.
원본 규칙에 따라 행의 형식이 MM-DD-YYYY로 식별되면, SQLite에서 형식화 전에 각 부분을 지원되는 ISO 날짜로 재배열할 수 있습니다. 예를 들어 event_date = '12-31-2022', source_format = 'MM-DD-YYYY'인 경우 CASE WHEN source_format = 'MM-DD-YYYY' THEN strftime('%Y-%m-%d', substr(event_date, 7, 4) || '-' || substr(event_date, 1, 2) || '-' || substr(event_date, 4, 2)) WHEN source_format = 'YYYY-MM-DD' THEN strftime('%Y-%m-%d', event_date) ELSE NULL END AS normalized_date를 사용하세요. 첫 번째 분기는 2022-12-31을 반환합니다. 인식할 수 없는 source_format이 지정된 행은 변환된 것처럼 표시하는 대신 NULL을 반환합니다. 문자열 모양을 확인하면 행을 분류하는 데 도움이 될 수 있지만, 문자 위치가 일치한다고 해서 월과 일이 유효한 달력 날짜라는 뜻은 아닙니다. 신뢰할 수 없는 값을 가져올 때는 달력 날짜의 유효성을 별도로 확인하세요.
결과를 확인하고 인식되지 않는 값 처리하기
반환값이 NULL인지 확인하고, 조사하는 동안 원본 값을 보관하세요. NULL은 날짜 함수가 형식화된 값을 만들지 못했다는 뜻입니다. 대체 날짜가 아니므로 그런 값처럼 조용히 취급해서는 안 됩니다. 공백, 연·월·일의 정확한 순서, 타임스탬프에 변환 로직이 처리하는 접미사가 포함되어 있는지 확인하세요.
값이 외부 피드에서 온다면 데이터를 수집할 때 형식을 표준화하고 사용한 원본 형식을 기록하세요. 행의 형식을 안전하게 판별할 수 없다면 추측하지 말고 데이터 정리를 위해 미해결 상태로 남겨 두세요. strftime()는 ISO 순서가 아닌 표시 패턴에도 유용하지만, 출력 패턴을 바꾸면 반환되는 텍스트만 바뀌고 저장된 표현은 그대로입니다. 이 예제는 SQLite를 대상으로 합니다. 다른 데이터베이스 엔진은 날짜 함수와 파싱 규칙이 다릅니다.