SQLite에서 DATETIME 값은 어떻게 작동합니까?


110

Android 앱을 만들고 있는데 생성 기록의 날짜 / 시간을 저장해야합니다. 그러나 SQLite 문서에서는 "SQLite에는 날짜 및 / 또는 시간을 저장하기 위해 따로 설정된 스토리지 클래스가 없습니다"라고 말하며 "텍스트, REAL 또는 INTEGER 값으로 날짜와 시간을 저장할 수 있습니다"라고 말합니다.

한 유형을 다른 유형보다 사용하는 기술적 이유가 있습니까? 그리고 단일 열에 행에서 행까지 세 가지 형식 중 하나로 날짜를 저장할 수 있습니까?

나중에 날짜를 비교해야합니다. 예를 들어, 내 앱에서 A 날짜부터 B 날짜까지 생성 된 모든 레코드를 표시합니다. 실제 DATETIME 열이 없으면 비교가 어려울 수 있습니다.


답변:


83

SQlite에는 특정 날짜 / 시간 유형이 없습니다. 당신은 사용할 수 있습니다 TEXT, REAL또는 INTEGER당신의 요구에 맞는 중, 유형.

DOCS에서 바로

SQLite에는 날짜 및 / 또는 시간을 저장하기 위해 따로 설정된 스토리지 클래스가 없습니다. 대신 SQLite의 기본 제공 날짜 및 시간 함수는 날짜와 시간을 TEXT, REAL 또는 INTEGER 값으로 저장할 수 있습니다.

  • ISO8601 문자열의 TEXT ( "YYYY-MM-DD HH : MM : SS.SSS").
  • 율리우스 일 숫자로 REAL, proleptic 그레고리력 달력에 따라 BC 4714 년 11 월 24 일 그리니치에서 정오 이후 일 수.
  • INTEGER as Unix Time, 1970-01-01 00:00:00 UTC 이후의 초 수입니다.

애플리케이션은 이러한 형식 중 하나로 날짜와 시간을 저장하고 내장 된 날짜 및 시간 함수를 사용하여 형식간에 자유롭게 변환하도록 선택할 수 있습니다.

SQLite 내장 날짜 및 시간 함수는 여기에서 찾을 수 있습니다 .


11
중요 사항-날짜를 저장하는 모든 방법은 표준 =, <,> 및 BETWEEN 연산자를 사용하여 비교할 수있는 형식을 사용합니다.
Larry Lustig 2015

2
"SQLite에는 날짜 및 / 또는 시간을 저장하기위한 스토리지 클래스가 따로 설정되어 있지 않습니다."-문서에 언급되지 않은 DATE 및 DATETIME 유형이있는 경우를 제외하고
Slabko

12
@Slabko 그렇지 않습니다. SQLite는 선언 된 열 유형으로 모든 것을 허용합니다 (DATETIME 포함). 이를 기반으로 해당 열에 스토리지 클래스와의 유사성을 제공합니다 (문서에 DATETIME에 대해 작동하는 방법에 대한 예제도 있음). 각 항목이 실제로 다른 스토리지 클래스를 가질 수 있으므로이 선호도는 힌트와 비슷합니다. 스토리지 클래스는 여전히 유형보다 약한 단계이며 여러 유형으로 지원 될 수 있습니다. 예, DATETIME을 사용할 수 있습니다. 아니요, 실제로 유형 또는 스토리지 클래스로 지원하지 않습니다. 예, 문서에는 실제로 "DATETIME"이라는 단어가 포함되어 있습니다.
재스퍼

20

SQLite에는 날짜 및 / 또는 시간을 저장하기 위해 따로 설정된 스토리지 클래스가 없습니다. 대신 SQLite의 기본 제공 날짜 및 시간 함수는 날짜와 시간을 TEXT, REAL 또는 INTEGER 값으로 저장할 수 있습니다.

ISO8601 문자열의 TEXT ( "YYYY-MM-DD HH : MM : SS.SSS"). 율리우스 일 숫자로 REAL, proleptic 그레고리력 달력에 따라 BC 4714 년 11 월 24 일 그리니치에서 정오 이후 일 수. INTEGER as Unix Time, 1970-01-01 00:00:00 UTC 이후의 초 수입니다. 애플리케이션은 이러한 형식 중 하나로 날짜와 시간을 저장하고 내장 된 날짜 및 시간 함수를 사용하여 형식간에 자유롭게 변환하도록 선택할 수 있습니다.

즉, INTEGER를 사용 하고 Unix epoch (1970-01-01 00:00:00 UTC) 이후 초를 저장합니다.


1
나는 이것도 선호합니다. 표준 날짜 / 시간 관련 클래스는 어쨌든 longs에 의해 내부적으로 지원되며 longs를 비교하는 것은 매우 쉽습니다.
Karakuri

1
@dtmilano 문자열 대신 INTEGER를 선호하는 이유는 무엇입니까?
IgorGanapolsky 2014-06-09

1
INTEGER는 8 바이트 만 사용하고 TEXT는이 예에서 23 바이트를 사용합니다. 데이터를 저장하는 유형을 선택하는 방법이 명확하지 않습니다. INTEGER 유형의 열을 생성하면 함수가 자동으로 Unix Time으로 저장된다는 의미입니까?
레이 진츠

2
REAL도 8 바이트를 사용합니다. Epoch 초는 2286 년 말까지 10 자리이며 IEEE double 은 15-17 개의 유효 숫자를 지원하므로 밀리 초보다 나은 해상도를 제공합니다. 숫자 시대 RSQLite로 변환 POSIXct하는 것 같아서 충분히 잘 작동합니다.
r2evans

@ r2evans 당신이 무슨 말을하는지 잘 모르겠습니다. Epoch 이후 밀리 초를 저장하려면 어떻게해야합니까?
Michael

14

SQLite의 강력한 기능 중 하나는 스토리지 유형을 선택할 수 있다는 것입니다. 세 가지 가능성 각각의 장점 / 단점 :

  • ISO8601 문자열

    • 문자열 비교는 유효한 결과를 제공합니다.
    • 소수점 세 자리까지 분수 초를 저장합니다.
    • 더 많은 저장 공간 필요
    • 데이터베이스 브라우저를 사용할 때 그 값을 직접 볼 수 있습니다.
    • 다른 용도로 구문 분석 필요
    • "기본 current_timestamp"열 수정자는이 형식을 사용하여 저장합니다.
  • 실수

    • 초에 대한 높은 정밀도
    • 가장 긴 시간 범위
  • 정수

    • 가장 낮은 저장 공간
    • 빠른 작업
    • 작은 시간 범위
    • 가능한 2038 년 문제

다른 유형을 비교하거나 외부 응용 프로그램으로 내 보내야하는 경우 필요에 따라 SQLite의 자체 날짜 시간 변환 함수 를 자유롭게 사용할 수 있습니다.


1
2038 년 문제가있는 이유는 무엇입니까? INTEGER는 64 비트 스토리지를 지원하는 것 같습니다.
guan boshen

1
@guanboshen 내가 말할 수있는 한, 2038 년에 대해 걱정할 유일한 이유는 호스트 플랫폼에 대한 지원 일 것입니다. SQLite 문서 는 참조 구현에서 C localtime_r()( sqlite.org/lang_datefunc.html#caveats_and_bugs ) 를 사용한다고 주장 localtime()하며 호스트 플랫폼에 32 비트가있는 경우 잠재적으로 2038에 취약 할 수 있습니다 time_t. 즉, SQLite는 외부 날짜를 안전한 범위 사전 변환으로 매핑하여 이러한 가능성을 방지한다고 주장하기 때문에 (동일한 링크 참조) 난해한 경우를 제외하고는 문제가되지 않을 것 같습니다.
Zoë Sparks

@ ZoëSparks 설명해 주셔서 감사합니다.
guan boshen

7

거의 모든 날짜와 시간 문제에 대해 매우 간단하게 단순화하는 것을 선호합니다. 정수에 저장된 초까지.

정수는 데이터베이스, 플랫 파일 등에서 항상 정수로 지원됩니다. 약간의 수학을 수행하고 다른 유형으로 캐스트하고 원하는대로 날짜 형식을 지정할 수 있습니다.

이렇게하면 [여기에 현재 즐겨 찾기 데이터베이스 삽입]이 우연히 오늘 선택한 날짜 형식을 사용하지 않은 [향후 즐겨 찾기 데이터베이스]로 대체 될 때 걱정할 필요가 없습니다.

약간의 수학 오버 헤드 (예 : 방법-2 초 소요, 필요한 경우 요점 게시) 일 뿐이며 나중에 날짜 / 시간과 관련된 많은 작업을 단순화합니다.


7

유형의 필드에 저장하십시오 long. 참조 Date.getTime()new Date(long)


어떻게 비교할 수 있습니까? 유 .. 나를 쿼리의 샘플을 제공 할 수 있습니다 : D
Khairil Ushan

코드 비교를 위해 Joda Time을 살펴보십시오 ( joda-time.sourceforge.net ) SQL에서 간단한 긴 비교 (예 : 숫자 비교)를 사용하십시오.
구문

a와 b 사이에서 생성되는 테이블에서 *를 선택하십시오.
koem 2013-06-21
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.