Saya memiliki tabel sqlite (v3) dengan definisi kolom ini:
"timestamp" DATETIME DEFAULT CURRENT_TIMESTAMP
Server tempat database ini berada dalam zona waktu CST. Ketika saya memasukkan ke dalam tabel saya tanpa menyertakan kolom cap waktu, sqlite secara otomatis mengisi bidang itu dengan cap waktu saat ini dalam GMT, bukan CST.
Apakah ada cara untuk mengubah pernyataan penyisipan saya untuk memaksa stempel waktu yang disimpan berada di CST? Di sisi lain, mungkin lebih baik menyimpannya dalam GMT (jika database dipindahkan ke zona waktu yang berbeda, misalnya), jadi apakah ada cara saya dapat memodifikasi SQL pilihan saya untuk mengonversi stempel waktu yang disimpan ke CST saat saya mengekstraknya dari tabel?
Jawaban:
Saya menemukan di dokumentasi sqlite ( https://www.sqlite.org/lang_datefunc.html ) teks ini:
Sepertinya itu tidak sesuai dengan kebutuhan saya, jadi saya mencoba mengubah sedikit fungsi "waktu", dan berakhir dengan ini:
Tampaknya berhasil - apakah itu cara yang benar untuk mengubah zona waktu Anda, atau adakah cara yang lebih baik untuk melakukannya?
sumber
cukup gunakan waktu lokal sebagai default:
sumber
Biasanya, Anda harus membiarkan stempel waktu dalam database dalam GMT, dan hanya mengonversinya ke / dari waktu lokal pada input / output, saat Anda dapat mengonversinya menjadi stempel waktu lokal pengguna (bukan server).
Alangkah baiknya jika Anda bisa melakukan hal berikut:
... untuk mengeluarkan stempel waktu pengguna pada Waktu Musim Panas Pasifik. Sayangnya, itu tidak berhasil. Menurut tutorial SQLite ini , bagaimanapun (gulir ke bawah ke "Perintah Tanggal dan Waktu Lainnya"), Anda dapat menanyakan waktu, dan kemudian menerapkan offset (dalam jam) pada saat yang sama. Jadi, jika Anda mengetahui perbedaan zona waktu pengguna, Anda bagus.
Tidak berurusan dengan aturan penghematan siang hari, meskipun ...
sumber
Dalam kasus (jarang diakui) bahwa datatime lokal dibutuhkan (saya, misalnya, menyimpan waktu lokal di salah satu database saya karena yang saya pedulikan adalah jam berapa hari itu dan saya tidak melacak di mana saya berada dalam istilah zona waktu ...), Anda dapat menentukan kolom sebagai
Bagian% Y-% m-% dT% H:% M tentu saja opsional; hanya bagaimana saya ingin waktu saya disimpan. [Selain itu, jika kesan saya benar, tidak ada tipe data "DATETIME" di sqlite, jadi tidak masalah apakah TEXT atau DATETIME digunakan sebagai tipe data dalam deklarasi kolom.]
sumber
Saat memiliki kolom yang ditentukan dengan "
NOT NULL DEFAULT CURRENT_TIMESTAMP
," rekaman yang dimasukkan akan selalu disetel dengan waktu UTC / GMT.Inilah yang saya lakukan untuk menghindari keharusan memasukkan waktu dalam pernyataan INSERT / UPDATE saya:
Uji untuk melihat apakah itu berhasil ...
Semoga membantu.
sumber
sumber
SELECT datetime(CURRENT_TIMESTAMP, 'localtime')
sumber
Anda juga dapat mengubah kolom waktu menjadi stempel waktu dengan menggunakan strftime ():
Memberi anda:
Kolom tabel 'timestamp' bisa berupa kolom teks, menggunakan
current_timestamp
as DEFAULT.Tanpa strftime:
Memberi anda:
sumber
Saya pikir ini mungkin membantu.
sumber
Waktu saat ini, dalam zona waktu mesin Anda:
Sesuai http://www.sqlite.org/lang_datefunc.html
sumber
Time ( 'now', 'localtime' )
dan Tanggal( 'now', 'localtime' )
bekerja.sumber