Wydaje się, że nie mogę uzyskać wiarygodnych wyników zapytania względem bazy danych sqlite przy użyciu ciągu daty i godziny jako porównania:
select *
from table_1
where mydate >= '1/1/2009' and mydate <= '5/5/2009'
jak mam obsługiwać porównania datetime do sqlite?
update: field mydate jest typem danych DateTime
mydate
kolumnie? Domyślam się, że nie jest to jeden z obsługiwanych formatów SQLite: sqlite.org/lang_datefunc.html'2009-11-13'
dla mojej daty będzie mniej niż'2009-11-13 00:00:00'
.)Datetime()
co @Brad zawarł w swojej wzmiance o rozwiązaniu. W przeciwnym razie VS2012 narzeka. Dziękuję Brad.Odpowiedzi:
SQLite nie ma dedykowanych typów datetime , ale ma kilka funkcji datetime . Postępuj zgodnie z formatami reprezentacji ciągów (właściwie tylko formatami 1-10) rozumianymi przez te funkcje (przechowując wartość jako ciąg), a następnie możesz ich użyć, a także porównanie leksykograficzne na ciągach będzie pasowało do porównania dat i godzin (o ile nie spróbuj porównać daty z czasami lub daty z czasami, co i tak nie ma większego sensu).
W zależności od używanego języka możesz nawet uzyskać automatyczną konwersję . (Co nie dotyczy porównań w instrukcjach SQL, takich jak przykład, ale ułatwi Ci życie).
źródło
date
idatetime
date
(lubdatetime
) w kolumnie, która wewnętrznie jest traktowana jakotext
. To pasuje do moich potrzeb.Aby rozwiązać ten problem, przechowuję daty jako
YYYYMMDD
. A zatem,where mydate >= '20090101' and mydate <= '20050505'
Po prostu DZIAŁA cały czas. Konieczne może być tylko napisanie parsera do obsługi sposobu, w jaki użytkownicy mogą wprowadzać swoje daty, aby można było je przekonwertować na
YYYYMMDD
.źródło
Ostatnio miałem ten sam problem i rozwiązałem go w ten sposób:
źródło
strftime
w klauzuli WHERE, tak jak w tym przykładzie, i mam pytanie: czy użycie wstrftime
ten sposób jest wydajne ? Czy jest oceniany raz dla każdego wiersza czy raz na zapytanie?Poniższe działa dobrze dla mnie przy użyciu SQLite:
źródło
Sqlite nie może porównywać dat. musimy zamienić na sekundy i rzucić na liczbę całkowitą.
Przykład
źródło
Następujące pracowały dla mnie.
źródło
Mam sytuację, w której potrzebuję danych sprzed dwóch dni i do końca dnia dzisiejszego. Doszedłem do następującego.
Ok, technicznie jutro też ściągam o północy jak na oryginalnym plakacie, jeśli były jakieś dane, ale wszystkie moje dane są historyczne.
Kluczową rzeczą do zapamiętania był wstępny plakat wykluczający wszystkie dane po 2009-11-15 00:00:00. Tak więc wszystkie dane, które zostały zarejestrowane o północy piętnastego, zostały uwzględnione, ale żadne dane po północy piętnastego nie zostały uwzględnione. Jeśli ich pytanie brzmiało,
Dla jasności użyj klauzuli między.
Byłoby trochę lepiej. Nadal nie uwzględnia sekund przestępnych, w których godzina faktycznie może mieć więcej niż 60 sekund, ale wystarczająco dobrze do dyskusji tutaj :)
źródło
Musiałem przechowywać czas z informacją o strefie czasowej i byłem w stanie uzyskać zapytania działające w następującym formacie:
Czas jest przechowywany w bazie danych jako zwykły TEKST w następującym formacie:
źródło
Poniżej znajdują się metody porównywania dat, ale wcześniej musimy określić format daty przechowywanej w DB
Mam daty zapisane w formacie MM / DD / RRRR GG: MM, więc należy je porównać w tym formacie
Poniższe zapytanie porównuje konwersję daty do formatu MM / DD / RRR i uzyskuje dane z ostatnich pięciu dni do dzisiaj. Operator BETWEEN pomoże i możesz po prostu określić datę rozpoczęcia ORAZ datę zakończenia.
Poniższe zapytanie użyje operatora większe niż (>).
Wszystkie obliczenia, które wykonałem, wykorzystują aktualny czas, możesz zmienić format i datę zgodnie z potrzebami.
Mam nadzieję, że to ci pomoże
Summved
źródło
Możesz także napisać własne funkcje użytkownika do obsługi dat w wybranym formacie. SQLite ma dość prostą metodę pisania własnych funkcji użytkownika. Na przykład napisałem kilka, aby dodać razem okresy czasu.
źródło
Moje zapytanie wykonałem w następujący sposób:
Otrzymałem wskazówkę dzięki odpowiedzi @ ifredy. Wszystko, co zrobiłem, to to, że chciałem, aby to zapytanie było uruchamiane w systemie iOS przy użyciu Objective-C. I to działa!
Mam nadzieję, że ktoś, kto zajmuje się programowaniem na iOS, również skorzysta z tej odpowiedzi!
źródło
Obecnie zajmuję się tworzeniem przy użyciu pakietu System.Data.SQlite NuGet (wersja 1.0.109.2). Które używają SQLite w wersji 3.24.0.
I to działa dla mnie.
Nie używam funkcji datetime (). Być może zaktualizowali już zapytanie SQL w tej wersji SQLite.
źródło