Czy w bazie danych sqlite można utworzyć tabelę, która domyślnie ma kolumnę ze znacznikiem czasu DATETIME('now')
?
Lubię to:
CREATE TABLE test (
id INTEGER PRIMARY KEY AUTOINCREMENT,
t TIMESTAMP DEFAULT DATETIME('now')
);
Daje to błąd ... Jak rozwiązać?
według dr. hipp w ostatnim poście z listy:
źródło
CURRENT_TIMESTAMP
więc utworzyłem własną funkcję w C, aby zwrócić liczbę mikrosekund od epoki, i cieszę się, że mogę tegoDEFAULT
teraz użyć .To tylko błąd składniowy, potrzebujesz nawiasu:
(DATETIME('now'))
Jeśli spojrzysz na dokumentację , zauważysz nawias dodany wokół opcji „expr” w składni.
źródło
Jest to pełny przykład oparty na innych odpowiedziach i komentarzach do pytania. W tym przykładzie znacznik czasu (
created_at
-kolumna) jest zapisywany jako strefa czasowa UTC z epoki uniksowej i konwertowany na lokalną strefę czasową tylko w razie potrzeby.Korzystanie z epoki uniksowej oszczędza miejsce do przechowywania - 4 bajty całkowite w porównaniu z 24-bajtowym ciągiem, gdy jest przechowywany jako ciąg ISO8601, patrz typy danych . Jeśli 4 bajty to za mało, można je zwiększyć do 6 lub 8 bajtów.
Zapisywanie znacznika czasu w strefie czasowej UTC ułatwia wyświetlanie rozsądnej wartości w wielu strefach czasowych.
Wersja SQLite to 3.8.6, która jest dostarczana z Ubuntu LTS 14.04.
Czas lokalny jest poprawny, ponieważ w momencie zapytania znajduję się w UTC + 2 DST.
źródło
Może być lepiej użyć typu PRAWDZIWEGO, aby zaoszczędzić miejsce.
Cytat z sekcji 1.2 typów danych w SQLite wersja 3
patrz ograniczenie kolumny .
I wstaw wiersz bez podania żadnej wartości.
źródło
integer(n)
gdzie można wybrać odpowiednią wartośćn
.Jest to błąd składniowy, ponieważ nie napisano nawiasu
jeśli napiszesz
(datetime („teraz”, „czas lokalny”))
źródło
Ten alternatywny przykład przechowuje czas lokalny jako liczbę całkowitą, aby zapisać 20 bajtów. Praca jest wykonywana w polu default, Update-trigger i View. strftime musi używać „% s” (pojedyncze cudzysłowy), ponieważ „% s” (podwójne cudzysłowy) rzucił na mnie błąd „Nie stała”.
źródło