development

SQLite DateTime 비교

big-blog 2020. 7. 29. 07:22
반응형

SQLite DateTime 비교


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

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

sqlite와 날짜 / 시간 비교를 어떻게 처리해야합니까?

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

해결책:

datetime 함수를 따르고 YYYY-MM-DD HH : mm : ss와 같은 문자열 형식을 사용하면 다음과 같이 좋은 결과를 얻었습니다.

select * 
  from table_1 
  where mydate >= Datetime('2009-11-13 00:00:00') 
  and mydate <= Datetime('2009-11-15 00:00:00')

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

사용하는 언어에 따라 자동 변환도 가능 합니다. (예와 같은 SQL 문의 비교에는 적용되지 않지만 인생을 더 편하게 할 수 있습니다.)


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

항상 평범하게 작동합니다. 사용자가 날짜를 입력하여로 변환 할 수있는 방법을 처리하기 위해 파서를 작성해야 할 수도 있습니다 YYYYMMDD.


최근에 같은 문제가 있었고 다음과 같이 해결했습니다.

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

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

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

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

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

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

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

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

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')

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

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


다음은 날짜를 비교하는 방법이지만 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');  

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

희망이 당신을 도울 것입니다

서밋


또한 원하는 형식으로 날짜를 처리 하기 위해 고유 한 사용자 함수작성할 수도 있습니다. SQLite에는 사용자 함수를 작성하는 매우 간단한 방법이 있습니다. 예를 들어, 지속 시간을 더하기 위해 몇 가지를 썼습니다.


시간대 정보가 포함 된 시간을 저장해야했으며 다음 형식으로 쿼리를 수행 할 수있었습니다.

"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

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

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

I got the hint by @ifredy's answer. The all I did is, I wanted this query to be run in iOS, using Objective-C. And it works!

Hope someone who does iOS Development, will get use out of this answer too!


Right now i am developing using System.Data.SQlite NuGet package (version 1.0.109.2). Which using SQLite version 3.24.0.

And this works for me.

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

I don't net to use the datetime() function. Perhaps they already updated the SQL query on that SQLite version.

참고URL : https://stackoverflow.com/questions/1975737/sqlite-datetime-comparison

반응형