SQLite DateTime 비교


117

datetime 문자열을 비교로 사용하여 sqlite 데이터베이스에 대한 쿼리에서 신뢰할 수있는 결과를 얻을 수없는 것 같습니다.

select * 
  from table_1 
 where mydate >= '1/1/2009' and mydate <= '5/5/2009'

sqlite에 대한 datetime 비교를 어떻게 처리해야합니까?

업데이트 : mydate 필드는 DateTime 데이터 유형입니다.


1
mydate열에 저장된 값은 어떤 날짜 형식입니까 ? SQLite 지원 형식 중 하나가 아닌 것 같아요 : sqlite.org/lang_datefunc.html
OMG Ponies

1
OMG, datetime 데이터 유형입니다
Brad

4
datetime ()을 사용하면 지정한 정확한 값이 생성됩니다. 여기서 사용할 이유가 없습니다. 대신 문자열을 사용하면됩니다. 날짜 만 처리하는 경우 0 시간 부분을 삭제해야합니다. 본질적으로 양쪽이 동일한 형식인지 확인합니다. (그렇지 않으면 '2009-11-13'mydate의 경우보다 작습니다 '2009-11-13 00:00:00'.)

1
SQLite가 포함 된 Visual Studio가 날짜 / 시간 쿼리를 실행하도록 작동하려면 Datetime()@Brad가 솔루션에 대한 언급에 포함 된 것처럼 을 사용해야합니다 . 그렇지 않으면 VS2012가 불평합니다. 감사합니다 브래드.
CaptainBli

솔루션을 업데이트 해 주셔서 감사합니다. .NET에서 날짜의 기본 형식이 실제로 "<"대 ">"의 반대가되는 것이 얼마나 이상합니다.
Dave Friedel 2015 년

답변:


57

SQLite에는 전용 datetime 유형 이 없지만 몇 가지 datetime 함수가 있습니다. 해당 함수에서 이해하는 문자열 표현 형식 (실제로는 1-10 형식 만 해당)을 따르고 (값을 문자열로 저장) 사용할 수 있으며, 문자열에 대한 사전 비교는 날짜 / 시간 비교와 일치합니다. 날짜를 시간과 비교하거나 날짜 시간을 시간과 비교하려고 시도하십시오. 어쨌든 전혀 의미가 없습니다).

사용하는 언어에 따라 자동 변환을 받을 수도 있습니다 . (예와 같은 SQL 문의 비교에는 적용되지 않지만 삶을 더 쉽게 만들 것입니다.)


10
첫 번째 문장을 읽는 모든 사람들을 위해, '17 SQLite에는 date그리고datetime
alisianoi

3
어제는 여기에서 유형 선호도에 대해 읽었습니다. sqlite.org/datatype3.html 기본적으로 날짜가 필요하면 내부적으로으로 처리되는 열에 date(또는 datetime)을 선언합니다 text. 그것은 내 필요에 맞습니다.
alisianoi

100

이 문제를 해결하기 위해 날짜를 YYYYMMDD. 그러므로, where mydate >= '20090101' and mydate <= '20050505'

그것은 항상 평범한 일입니다. 사용자가 날짜를 입력하는 방법을 처리하는 파서 만 작성하면 YYYYMMDD.


2
형식이 표준화 된 경우 YYYY-MM-DD는 대시가없는 것과 어떻게 다릅니 까? 비교가 똑같이 끝나지 않습니까?
Damon

2
@Damon : 나는 그가 데이터 유형에 대한 데이터를 int 사용 생각
thumbmunkeys

1
아니요, 이건 문자열입니다. 따옴표에서 볼 수 있습니다.하지만 이것은 좋은 생각입니다. YY MM DD 순서로 날짜를 비교할 수 있습니다. @Damon 그것은 또한 대시와 함께 작동해야합니다!
Sedat Kilinc 2011

1
yyyyMMddHHmmss 형식을 사용하여 저장하면 동일한 작업을 수행 할 수 있는지 궁금합니다. 그러면 시간 부분도 포함 할 수 있습니다. 오버플로 또는 무언가를 유발할까요?
FAIZAL

2
내가 사용 : YYYYMMDDhhmm 형식을 문제없이, 나는 YYYYMMDDHHMMSS이 같은 일을 기대
스티브 번

39

최근에 같은 문제가 발생하여 다음과 같이 해결했습니다.

SELECT * FROM table WHERE 
    strftime('%s', date) BETWEEN strftime('%s', start_date) AND strftime('%s', end_date)

% s는 작은 따옴표로 묶어야합니다. 예 : strftime ( '% s', date)
mvladic

효과가있다. 특정 날짜 이후 모든 행을 선택하도록 수정 된 솔루션 : SELECT * FROM table WHERE strftime ( '% s', added)> strftime ( '% s', "2017-01-01 00:00:00")
New Progammer

strftime이 예제와 같이 WHERE 절에서 사용 을 평가 하고 있는데 질문 strftime이 있습니다. 이렇게 사용하는 것이 효율적 입니까? 모든 행에 대해 한 번 또는 쿼리 당 한 번 평가됩니까?
Alvaro Gutierrez Perez

이것은 정답으로 받아 들여 져야합니다!
Luka Sh

20

다음은 SQLite를 사용하여 잘 작동합니다.

SELECT * 
    FROM ingresosgastos 
    WHERE fecharegistro BETWEEN "2010-01-01" AND "2013-01-01"

이것은 iOS에서 저에게 효과적이었습니다. Objective-C My Query는 다음과 같습니다. SELECT COUNT (carSold) FROM cars_sales_tbl WHERE date BETWEEN '2015-04-01'AND '2015-04-30'AND carType = "Hybrid"
Randika Vishman

9

Sqlite는 날짜를 비교할 수 없습니다. 초로 변환하고 정수로 캐스팅해야합니다.

SELECT * FROM Table  
WHERE  
CAST(strftime('%s', date_field)  AS  integer) <=CAST(strftime('%s', '2015-01-01')  AS  integer) ;

8

다음은 나를 위해 일했습니다.

SELECT *
FROM table_log
WHERE DATE(start_time) <= '2017-01-09' AND DATE(start_time) >= '2016-12-21'

대신 사용할 수 있습니다.
Tamim Attafi

6

최대 이틀 전부터 오늘까지의 데이터를 원하는 상황이 있습니다. 나는 다음에 도착했다.

WHERE dateTimeRecorded between date('now', 'start of day','-2 days') 
                           and date('now', 'start of day', '+1 day') 

좋아, 기술적으로도 원본 포스터처럼 내일 자정에 데이터가 있으면 내일 자정을 가져 오지만 내 데이터는 모두 과거입니다.

기억해야 할 핵심 사항은 초기 포스터에서 2009-11-15 00:00:00 이후 모든 데이터를 제외했다는 것입니다. 따라서 15 일 자정에 기록 된 데이터는 모두 포함 되었지만 15 일 자정 이후의 데이터 는 포함 되지 않았습니다. 그들의 질문이 있었다면

select * 
  from table_1 
  where mydate between Datetime('2009-11-13 00:00:00') 
                   and Datetime('2009-11-15 23:59:59')

명확성을 위해 between 절을 사용합니다.

조금 더 좋았을 것입니다. 한 시간이 실제로 60 초 이상을 가질 수있는 윤초는 여전히 고려하지 않지만 여기에서 토론하기에 충분합니다. :)


2

시간대 정보와 함께 시간을 저장해야했고 다음 형식으로 작동하는 쿼리를 얻을 수있었습니다.

"SELECT * FROM events WHERE datetime(date_added) BETWEEN 
      datetime('2015-03-06 20:11:00 -04:00') AND datetime('2015-03-06 20:13:00 -04:00')"

시간은 다음 형식의 일반 TEXT로 데이터베이스에 저장됩니다.

2015-03-06 20:12:15 -04:00

2

다음은 날짜를 비교하는 방법이지만 그 전에 DB에 저장된 날짜 형식을 식별해야합니다.

날짜가 MM / DD / YYYY HH : MM 형식으로 저장되어 있으므로 해당 형식으로 비교해야합니다.

  1. 아래 쿼리는 날짜를 MM / DD / YYY 형식으로 변환하고 지난 5 일부터 오늘까지 데이터를 가져 오는 것을 비교합니다. BETWEEN 연산자가 도움이 될 것이며 시작 날짜와 종료 날짜를 간단히 지정할 수 있습니다.

    select * from myTable where myColumn BETWEEN strftime('%m/%d/%Y %H:%M', datetime('now','localtime'), '-5 day') AND strftime('%m/%d/%Y %H:%M',datetime('now','localtime')); 
  2. 아래 쿼리는보다 큼 연산자 (>)를 ​​사용합니다.

      select * from myTable where myColumn > strftime('%m/%d/%Y %H:%M', datetime('now','localtime'), '-5 day');  

내가 한 모든 계산은 현재 시간을 사용하는 것이므로 필요에 따라 형식과 날짜를 변경할 수 있습니다.

이것이 당신을 도울 수 있기를 바랍니다

요약


1

사용자가 선택한 형식으로 날짜를 처리하는 사용자 함수 를 작성할 수도 있습니다. SQLite에는 사용자 함수를 작성하는 매우 간단한 방법이 있습니다. 예를 들어, 기간을 함께 추가하기 위해 몇 가지를 작성했습니다.


0

내 쿼리는 다음과 같습니다.

SELECT COUNT(carSold) 
FROM cars_sales_tbl
WHERE date
BETWEEN '2015-04-01' AND '2015-04-30'
AND carType = "Hybrid"

@ifredy의 대답으로 힌트를 얻었습니다. 내가 한 것은 Objective-C를 사용하여이 쿼리가 iOS에서 실행되기를 원했습니다. 그리고 작동합니다!

iOS 개발을 수행하는 사람이이 답변을 사용하기를 바랍니다!


0

지금은 System.Data.SQlite NuGet 패키지 (버전 1.0.109.2)를 사용하여 개발 중입니다. SQLite 버전 3.24.0을 사용합니다.

그리고 이것은 나를 위해 작동합니다.

SELECT * FROM tables WHERE datetime 
BETWEEN '2018-10-01 00:00:00' AND '2018-10-10 23:59:59';

datetime () 함수를 사용하지 않습니다. 아마도 그들은 이미 해당 SQLite 버전에서 SQL 쿼리를 업데이트했을 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.