Tworzę aplikacje na Androida i muszę zapisać datę / godzinę utworzenia rekordu. Dokumentacja SQLite mówi jednak, że „SQLite nie ma klasy pamięci przeznaczonej na przechowywanie dat i / lub godzin” i „może przechowywać daty i godziny jako wartości TEKST, REAL lub INTEGER”.
Czy istnieje techniczny powód, aby używać jednego typu zamiast innego? I czy pojedyncza kolumna może przechowywać daty w dowolnym z trzech formatów od wiersza do wiersza?
Później będę musiał porównać daty. Na przykład w moich aplikacjach pokażę wszystkie rekordy utworzone między datą A a datą B. Obawiam się, że brak prawdziwej kolumny DATETIME może utrudnić porównania.
Odpowiedzi:
SQlite nie ma określonego typu daty i godziny. Można użyć
TEXT
,REAL
lubINTEGER
typy, w zależności odpowiada Twoim potrzebom.Prosto z DOCS
Wbudowane funkcje daty i czasu SQLite można znaleźć tutaj .
źródło
Powiedziawszy to, użyłbym INTEGER i przechowałbym sekundy od epoki Uniksa (1970-01-01 00:00:00 UTC).
źródło
RSQLite
wydaje się, że konwertuje sięPOSIXct
na epokę numeryczną, więc dla mnie działa wystarczająco dobrze.Jedną z potężnych funkcji SQLite jest możliwość wyboru typu przechowywania. Zalety / wady każdej z trzech różnych możliwości:
Ciąg ISO8601
Prawdziwy numer
Liczba całkowita
Jeśli chcesz porównać różne typy lub wyeksportować do zewnętrznej aplikacji, możesz w razie potrzeby użyć własnych funkcji konwersji daty i godziny oprogramowania SQLite .
źródło
localtime_r()
( sqlite.org/lang_datefunc.html#caveats_and_bugs ) w implementacji referencyjnej ilocaltime()
może być potencjalnie podatna na 2038, jeśli platforma hosta ma 32-bitową wersjętime_t
. To powiedziawszy, ponieważ SQLite twierdzi, że chroni przed taką możliwością, mapując daty zewnętrzne w bezpiecznym zakresie przed konwersją (zobacz ten sam link), myślę, że jest to mało prawdopodobne, z wyjątkiem może ezoterycznych przypadków.Praktycznie we wszystkich sprawach dotyczących daty i czasu wolę upraszczać rzeczy, bardzo, bardzo proste ... Aż do sekund zapisanych w liczbach całkowitych.
Liczby całkowite zawsze będą obsługiwane jako liczby całkowite w bazach danych, płaskich plikach itp. Wykonujesz trochę matematyki i przerzucasz ją na inny typ, a datę możesz sformatować tak, jak chcesz.
Robiąc to w ten sposób, nie musisz się martwić, gdy [wstaw tutaj bieżącą ulubioną bazę danych] zostanie zastąpione przez [przyszłą ulubioną bazę danych], która przypadkowo nie używała formatu daty, który wybrałeś dzisiaj.
To tylko trochę narzutów matematycznych (np. Metody - zajmuje dwie sekundy, w razie potrzeby opublikuję streszczenie) i upraszcza wiele operacji dotyczących daty / czasu później.
źródło
Przechowuj go w polu typu
long
. ZobaczDate.getTime()
inew Date(long)
źródło