SQLite는 텍스트, 실수 또는 정수 데이터 유형을 사용하여 날짜를 저장할 수 있습니다. 또한 쿼리를 수행 할 때마다 format을 사용하여 결과가 표시됩니다 %Y-%m-%d %H:%M:%S
.
이제 SQLite 날짜 / 시간 함수를 사용하여 날짜 / 시간 값을 삽입 / 업데이트하면 실제로 밀리 초도 저장할 수 있습니다. 이 경우 format을 사용하여 결과가 표시됩니다 %Y-%m-%d %H:%M:%f
. 예를 들면 다음과 같습니다.
sqlite> create table test_table(col1 text, col2 real, col3 integer);
sqlite> insert into test_table values (
strftime('%Y-%m-%d %H:%M:%f', '2014-03-01 13:01:01.123'),
strftime('%Y-%m-%d %H:%M:%f', '2014-03-01 13:01:01.123'),
strftime('%Y-%m-%d %H:%M:%f', '2014-03-01 13:01:01.123')
);
sqlite> insert into test_table values (
strftime('%Y-%m-%d %H:%M:%f', '2014-03-01 13:01:01.126'),
strftime('%Y-%m-%d %H:%M:%f', '2014-03-01 13:01:01.126'),
strftime('%Y-%m-%d %H:%M:%f', '2014-03-01 13:01:01.126')
);
sqlite> select * from test_table;
2014-03-01 13:01:01.123|2014-03-01 13:01:01.123|2014-03-01 13:01:01.123
2014-03-01 13:01:01.126|2014-03-01 13:01:01.126|2014-03-01 13:01:01.126
이제 몇 가지 쿼리를 수행하여 실제로 시간을 비교할 수 있는지 확인하십시오.
sqlite> select * from test_table /* using col1 */
where col1 between
strftime('%Y-%m-%d %H:%M:%f', '2014-03-01 13:01:01.121') and
strftime('%Y-%m-%d %H:%M:%f', '2014-03-01 13:01:01.125');
2014-03-01 13:01:01.123|2014-03-01 13:01:01.123|2014-03-01 13:01:01.123
동일한 확인할 수 있습니다 SELECT
사용 col2
하고 col3
당신은 동일한 결과를 얻을 수 있습니다. 보시다시피 두 번째 행 (126 밀리 초)은 반환되지 않습니다.
BETWEEN
따라서 포괄적 인 점 에 유의하십시오 .
sqlite> select * from test_table
where col1 between
/* Note that we are using 123 milliseconds down _here_ */
strftime('%Y-%m-%d %H:%M:%f', '2014-03-01 13:01:01.123') and
strftime('%Y-%m-%d %H:%M:%f', '2014-03-01 13:01:01.125');
... 같은 세트를 반환합니다.
다른 날짜 / 시간 범위로 놀아 보면 모든 것이 예상대로 작동합니다.
strftime
기능 없이는 어떻습니까?
sqlite> select * from test_table /* using col1 */
where col1 between
'2014-03-01 13:01:01.121' and
'2014-03-01 13:01:01.125';
2014-03-01 13:01:01.123|2014-03-01 13:01:01.123|2014-03-01 13:01:01.123
어떤 약이없는 strftime
기능없이 밀리 초?
sqlite> select * from test_table /* using col1 */
where col1 between
'2014-03-01 13:01:01' and
'2014-03-01 13:01:02';
2014-03-01 13:01:01.123|2014-03-01 13:01:01.123|2014-03-01 13:01:01.123
2014-03-01 13:01:01.126|2014-03-01 13:01:01.126|2014-03-01 13:01:01.126
무엇에 대해 ORDER BY
?
sqlite> select * from test_table order by 1 desc;
2014-03-01 13:01:01.126|2014-03-01 13:01:01.126|2014-03-01 13:01:01.126
2014-03-01 13:01:01.123|2014-03-01 13:01:01.123|2014-03-01 13:01:01.123
sqlite> select * from test_table order by 1 asc;
2014-03-01 13:01:01.123|2014-03-01 13:01:01.123|2014-03-01 13:01:01.123
2014-03-01 13:01:01.126|2014-03-01 13:01:01.126|2014-03-01 13:01:01.126
잘 작동합니다.
마지막으로, 프로그램 내에서 실제 작업을 처리 할 때 (sqlite 실행 파일을 사용하지 않고 ...)
BTW : 나는 JDBC (하지 않도록 다른 언어에 대한)에서 ... SQLite는-JDBC 드라이버 v3.7.2 사용하고 xerial을 - 어쩌면 새로운 버전에서는 안드로이드 개발하는 경우, 당신은하지 않습니다 ... 동작은 아래에 설명 변경 jdbc 드라이버가 필요합니다. 를 사용하여 모든 SQL 작업을 제출할 수 있습니다 SQLiteOpenHelper
.
JDBC 데이터베이스에서 실제 날짜 / 시간 값을 얻을 수있는 다른 방법이 있습니다 java.sql.Date
, java.sql.Time
하고 java.sql.Timestamp
.
종래 방법에 java.sql.ResultSet
(명백하게)이다 getDate(..)
, getTime(..)
그리고 getTimestamp()
각각.
예를 들면 다음과 같습니다.
Statement stmt = ... // Get statement from connection
ResultSet rs = stmt.executeQuery("SELECT * FROM TEST_TABLE");
while (rs.next()) {
System.out.println("COL1 : "+rs.getDate("COL1"));
System.out.println("COL1 : "+rs.getTime("COL1"));
System.out.println("COL1 : "+rs.getTimestamp("COL1"));
System.out.println("COL2 : "+rs.getDate("COL2"));
System.out.println("COL2 : "+rs.getTime("COL2"));
System.out.println("COL2 : "+rs.getTimestamp("COL2"));
System.out.println("COL3 : "+rs.getDate("COL3"));
System.out.println("COL3 : "+rs.getTime("COL3"));
System.out.println("COL3 : "+rs.getTimestamp("COL3"));
}
// close rs and stmt.
SQLite에는 실제 DATE / TIME / TIMESTAMP 데이터 형식이 없으므로이 세 가지 메서드는 모두 개체가 0으로 초기화 된 것처럼 값을 반환합니다.
new java.sql.Date(0)
new java.sql.Time(0)
new java.sql.Timestamp(0)
따라서 질문은 어떻게 날짜 / 시간 / 시간 소인 객체를 실제로 선택, 삽입 또는 업데이트 할 수 있습니까?입니다. 쉬운 대답이 없습니다. 다른 조합을 시도 할 수 있지만 모든 SQL 문에 SQLite 함수를 포함시켜야합니다. Java 프로그램 내에서 텍스트를 Date 객체로 변환하는 유틸리티 클래스를 정의하는 것이 훨씬 쉽습니다. 그러나 SQLite는 모든 날짜 값을 UTC + 0000으로 변환합니다.
요약하면, 항상 올바른 데이터 유형을 사용하는 일반적인 규칙이나 Unix 시간을 나타내는 정수 (epoch 이후 밀리 초)에도 불구하고 모든 SQL 문을 복잡하게하기보다는 기본 SQLite 형식 ( '%Y-%m-%d %H:%M:%f'
또는 Java 'yyyy-MM-dd HH:mm:ss.SSS'
)을 사용하는 것이 훨씬 쉽습니다 . SQLite 함수. 전자의 접근 방식은 유지 관리가 훨씬 쉽습니다.
TODO : 안드로이드에서 getDate / getTime / getTimestamp를 사용할 때 결과를 확인할 것입니다 (API15 이상) ... 어쩌면 내부 드라이버가 sqlite-jdbc와 다를 수 있습니다 ...