2012-05-31 12 views
14

przechowywać daty jako String w mojej bazy danych, w tym formacie:Porównaj daty (przechowywane jako ciąg) w bazie danych Android sqlite?

YYYY-MM-DD HH:MM:SS 

który jest jednym z obsługiwanych formatów (http://www.sqlite.org/lang_datefunc.html). Teraz chcę porównać te przechowywane daty (dobrze, ciągi) z innymi datami. Moje daty są przechowywane w kolumnie column_date, więc próbuję to:

SELECT * FROM MyTable 
WHERE 
(Date(column_date) >= Date (2000-01-01) AND Datetime(column_date) <= Datetime (2050-01-01)) 

Jak czytać dokumentację, The date and time functions use a subset of IS0-8601 date and time formats. The date() function returns the date in this format: YYYY-MM-DD. więc przypuszczam, że robię to dobrze - tworzę datę z przechowywanej ciąg i porównać je z datą utworzone z innych ciągów.

Ale to nie działa, nawet jeśli column_date jest datą od tego roku i jak widać daty rozpoczęcia i zakończenia są bardzo życzliwe. Próbował również to (datetime używany zamiast data)

SELECT * FROM MyTable 
    WHERE 
    (datetime(column_date) >= Date (2000-01-01) AND datetime(column_date) <= Datetime (2050-01-01)) 

i to (zastosowanie między zamiast < = i> =)

SELECT * FROM MyTable 
    WHERE 
    (Date(column_date) between Date (2000-01-01) AND Datetime (2050-01-01)) 

i wszystkich innych możliwych kombinacji. Co ja do diabła robię źle, czy jestem głupi, czy dokumentacja kłamie, czy brakowało mi czegoś bardzo ważnego? Próbuję znaleźć rozwiązanie kilka godzin, ale nic nie działa ...

Odpowiedz

17

jeśli przechowywania dat jako ciągów w formacie

YYYY-MM-DD HH:mm:ss 

====> następnie data pole jest typ danych datetime

W ten sposób Muszą używać takich zapytań

select * 
    from MyTable 
    where mydate >= Datetime('2000-01-01 00:00:00') 
    and mydate <= Datetime('2050-01-01 23:00:59') 

możesz również użyć fragmentu podanego przez @Joop Eggen z th między operatorem jest to samo approche.

Operator BETWEEN jest logicznie równoważny z parą porównań. "x BETWEEN y Z" jest równoważne "x> = y AND x < = z" oprócz tego, że w MIĘDZYKRÓTCE wyrażenie x jest oceniane tylko raz.zobacz sqlite3 docs

+0

Nie wierzę, że jest to dokładne ... z dokumentów SQLite "Funkcja date() zwraca datę w tym formacie: RRRR-MM-DD". Sposób, w jaki to czytam oznacza, że ​​nawet jeśli dane są przechowywane jako format DateTime, użycie 'Date()' spowoduje zwrócenie tylko części daty. Czy to nie jest poprawne? – Barak

+0

to działa, ale wciąż nie mogę tego zrozumieć. W docs jego wyraźnie powiedział, że data, lub datetime return DATE. A moja kolumna to ciąg. Jak to możliwe, że możesz porównać String (= mydate) z datą (data utworzona z ciągu 2000-01-01 00:00:00 z użyciem funkcji datetime)? To nielogiczne. Dlaczego nie zastosowałeś Datetime również do mojej kolumny, jeśli jej ciąg? – qkx

+0

tak faktycznie, dla mnie jest to logicznie poprawne: Datetime (ciąg mydate) <= Datetime (inny ciąg daty). Ale to nie działa, a twój kod działa;) Funny – qkx

6
SELECT * 
FROM MyTable 
WHERE 
    column_date BETWEEN '2000-01-01 00:00:00' AND '2050-01-01 23:00:59' 

Powinien załatwić sprawę. Używa tylko ciągów, ale powiedziałeś, że byłoby to odpowiednie.

Błąd polegał na tym, że brakowało części czasu lub nie wykonywano substr tylko w części daty. A ponadto funkcje konwersji danych/czasu mogą również dawać złe rzeczy.

+0

to działa ... ale jak to możliwe? Porównujesz ciągi znaków z funkcją daty (między)? – qkx

+0

Myślałem, że column_date był ciągiem znaków - VARCHARS? Ale DATETIME też by się udało, ponieważ standard * 2000-01-01T00: 0: 00 'i "2000-01-01 00:00:00" również są zamienne. –

+0

Czy możemy sprawdzić tę datę? 01-01-2011 00:00:00? – CoronaPintu

3

Myślę, że problemem jest tutaj ...

AND Datetime(column_date) <= Datetime (2050-01-01)) 

Dlaczego używasz DateTime tutaj zamiast Date?

Spróbuj tego:

SELECT * FROM MyTable WHERE (Date(column_date) >= Date (2000-01-01) AND Date(column_date) <= Date (2050-01-01)) 
+0

czy możemy przetasować ten format 01-01-2000? – CoronaPintu

+0

to rozwiązało problem – Cristiana214

2

Datą złożoną w tabeli SQLite będzie TEKST, a data powinna być zapisana jako format "2012-12-31 00:12:00", dla której dawka porównawcza nie przysporzy problemów i jeśli uznamy, że pola są date_from i date_to i jesteśmy przechowywania aktualną datę w TO_DATE wtedy powinniśmy otrzymać bieżącą datę jako mieszkiem i

 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
     String to_date = sdf.format(new Date()); 

i zapytanie SQL powinny być

crs = db.rawQuery(
     "SELECT _id, date_from, date_to, done_or_not, list_name " + 
     "FROM list_tbl " + 
     "WHERE " + 
     "date_from <= Datetime('"+to_date+"') AND date_to >= Datetime('"+to_date+"')", null); 
0

porównania dat (przechowywane jako ciąg) w Androidzie Baza danych SQLite. termin wykorzystania w formacie 12/07/2015 i użyć kwerendy tak:

SELECT * FROM tableName WHERE Date >=('12/07/2015') and appointmentDate <('13/07/2015')"; 

Działa to dla mnie.

+0

Działa to tylko dla bieżącego miesiąca, po miesiącu zmiany nie działa. – Cheerag

Powiązane problemy