2011-03-26 2 views
6

SQLite로 작업 중이므로 날짜를 텍스트로 저장하고 있습니다.문자열/텍스트로 저장된 날짜를 직접 비교할 수 있습니까?

YYYY-MM-DD hh:mm:ss

는 지금까지 내가 결정할 수있는, 내가 그들을 주문하거나 서로를 비교할 수 있어야한다 그냥 증분 잘 시작하고 이동 떠난 그들은 단지 숫자처럼, 날짜 함수에 대해 걱정하지 않는 등 , 모든 값은 숫자이며 숫자가 아닌 문자는 항상 표준화되어 있으며 24 시간 사용하고 있습니다.

나는 사람들이 온라인으로 날짜를 텍스트로 변환해야한다는 것을 계속 언급하고 있지만 비교할 때 날짜를 변환해야하는 이유를 계속해서 지켜보고 있지만, 그 이유는 그들이 가장 큰 -> 작은 주문. 분명히 수학을 할 수는 없지만 Select DateTime From Table where DateTime > 2010-04-21 15:34:55은 완전히 신뢰할 수 있어야합니다. 맞습니까?

내가 생각하지 못한 예외가 있습니까?

답변

3

날짜를 데이터베이스에 저장할 때 많은 뚜렷한 언급이있는 이유는 대부분의 데이터베이스 엔진이 날짜/시간에 대해 '기본'데이터 형식을 갖고 있기 때문입니다. SQLite는 그렇지 않습니다. 날짜를 문자열 또는 줄리안 날짜 부동 소수점 값으로 저장하는 것이 좋습니다.

또한 일부 다른 데이터베이스는 정렬 할 수없는 날짜 문자열을 얻는 방법을 찾기가 어려운 다소 날짜 흐리게 표시되는 기능 (나는 당신을보고 있습니다. SQL Server)을 가지고 있습니다. SQLite의 기본 날짜 형식 (YYYY-MM-DD HH : NN : SS)은 완벽하게 정렬이 가능하고 읽기 쉽습니다.

프리젠 테이션하는 것처럼 올바른 형식을 사용하는 한 비교 또는 대조 할 때 텍스트 날짜를 사용하면 문제가 없습니다.

실제로 SQLite의 date and time functions을 사용하여 수학을 할 수도 있습니다. 그들은 다소 정통하지만 놀랍도록 유연합니다.

+0

좋습니다. 왜 그렇게 일하지 않을지 아무 이유도 모르겠다. – Damon

5

잘 작동합니다. SQLite는 다른 많은 데이터베이스처럼 실제 DATE (또는 DATETIME) 데이터 유형을 가지고 있지 않습니다. 옵션은 올바르게 정렬 (YYYY-MM-DD 또는 YYYY-MM-DD hh : mm : ss)하거나 날짜를 숫자로 변환하여 대신 저장하는 문자열 형식으로 날짜를 저장하는 것입니다. 당신이 문자열 형식을 사용하는 경우

, 당신은 물론 따옴표를 포함해야 :

SELECT DateTime FROM Table WHERE DateTime > '2010-04-21 15:34:55' 
+1

슈퍼, 작은 따옴표로 묶는 문자열이 내 하루를 저장했습니다. – Saqib

1

가 그들은 한 실제 값은 당신이 그들을 것으로 예상 무엇으로 텍스트로 비교 될 수있다. 그것이 문제이다.

날짜를 텍스트로 비교하는 것은 가위로 실행하는 것과 같습니다. 그러나 SQLite는 항상 가위로 실행합니다. 당신이 '2011-31-31 08:63:00'처럼 삽입 또는 갱신 값하려고 할 때 SQL 표준을 준수

sqlite> create table test (d1 datetime primary key); 
sqlite> insert into test values ('2011-31-31 08:63:00'); 
sqlite> select * from test; 
2011-31-31 08:63:00 

의 DBMS는 "범위를 벗어난"오류가 발생합니다. 그러나 SQLite를 사용하면 아무 것도 삽입 할 수 없습니다. datetime 열에 'Catcall'을 삽입 할 수도 있습니다. (시도해보십시오.)

SQLite는 텍스트를 사용하는 경우 "가위로 실행"동작을 제공합니다.

sqlite> create table test (d1 varchar(25) primary key); 
sqlite> insert into test values ('2011-31-31 08:63:00'); 
sqlite> select * from test; 
2011-31-31 08:63:00 

값이 예상과 다를 경우 다음과 같은 종류의 동작이 나타날 수 있습니다.

sqlite> create table test (d1 varchar(25), d2 varchar(25)); 
sqlite> insert into test values ('2011-01-01 08:00:00', '2011-01-01 08:15:00'); 
sqlite> select d1<d2 from test; 
1 
sqlite> update test set d2 = '2011+01-01 08:15:00'; 
sqlite> select d1<d2 from test; 
0 
+0

공정하게하려면 'Catcall'은 SQLite의'datetime' 열에 삽입되지 않습니다. 오히려 열은 텍스트 열이됩니다. 가위로 실행하는 한 SQLite는 정의 된 25 자 제한을 준수하지 않으므로 varchar (25) 열에 원하는만큼의 텍스트를 삽입 할 수 있습니다. –

1

당신이하는 일은 대조와 검색 뿐이라면 괜찮을 것입니다. 사람들은 정확히이 목적을 위해 파일 이름으로 수년간이 형식을 사용 해왔다. 특정 날짜로부터 30 일 이내에 모든 레코드를 찾는 것처럼 계산이 필요한 작업을 수행해야하는 경우에만 해체되기 시작해야합니다.

관련 문제