Tengo una tabla sqlite (v3) con esta definición de columna:
"timestamp" DATETIME DEFAULT CURRENT_TIMESTAMP
El servidor en el que vive esta base de datos se encuentra en la zona horaria CST. Cuando inserto en mi tabla sin incluir la columna de marca de tiempo, sqlite rellena automáticamente ese campo con la marca de tiempo actual en GMT, no en CST.
¿Hay alguna forma de modificar mi declaración de inserción para forzar que la marca de tiempo almacenada esté en CST? Por otro lado, probablemente sea mejor almacenarlo en GMT (en caso de que la base de datos se mueva a una zona horaria diferente, por ejemplo), entonces, ¿hay alguna manera de que pueda modificar mi SQL seleccionado para convertir la marca de tiempo almacenada a CST cuando extraerlo de la mesa?
Respuestas:
Encontré en la documentación de sqlite ( https://www.sqlite.org/lang_datefunc.html ) este texto:
Eso no parecía encajar con mis necesidades, así que intenté cambiar un poco la función "datetime" y terminé con esto:
Eso parece funcionar: ¿es esa la forma correcta de convertir para su zona horaria o hay una mejor manera de hacerlo?
fuente
simplemente use la hora local como predeterminada:
fuente
Como regla general, debe dejar las marcas de tiempo en la base de datos en GMT y solo convertirlas a / desde la hora local en la entrada / salida, cuando puede convertirlas a la marca de tiempo local del usuario (no del servidor).
Sería bueno si pudiera hacer lo siguiente:
... para generar la marca de tiempo de un usuario en la hora de verano del Pacífico. Desafortunadamente, eso no funciona. Sin embargo, de acuerdo con este tutorial de SQLite (desplácese hacia abajo hasta "Otros comandos de fecha y hora"), puede solicitar la hora y luego aplicar una compensación (en horas) al mismo tiempo. Entonces, si conoce la compensación de la zona horaria del usuario, está bien.
Sin embargo, no se ocupa de las reglas del horario de verano ...
fuente
En el caso (raro admitido) de que se desee una hora de datos local (yo, por ejemplo, guardo la hora local en una de mis bases de datos, ya que lo único que me importa es la hora del día y no hago un seguimiento de dónde estaba en términos de zonas horarias ...), puede definir la columna como
La parte% Y-% m-% dT% H:% M es, por supuesto, opcional; así es como me gusta que se almacene mi tiempo. [Además, si mi impresión es correcta, no hay un tipo de datos "DATETIME" en sqlite, por lo que realmente no importa si se usa TEXT o DATETIME como tipo de datos en la declaración de columna.]
fuente
Cuando se tiene una columna definida con "
NOT NULL DEFAULT CURRENT_TIMESTAMP
," los registros insertados siempre se configurarán con la hora UTC / GMT.Esto es lo que hice para evitar tener que incluir la hora en mis declaraciones INSERT / UPDATE:
Prueba para ver si funciona ...
Espero que ayude.
fuente
fuente
SELECT datetime(CURRENT_TIMESTAMP, 'localtime')
fuente
También puede convertir la columna de tiempo en una marca de tiempo usando strftime ():
Te dio:
La columna de la tabla 'marca de tiempo' puede ser un campo de texto par, utilizando
current_timestamp
como DEFAULT.Sin strftime:
Te dio:
fuente
Creo que esto podría ayudar.
fuente
La hora actual, en la zona horaria de su máquina:
Según http://www.sqlite.org/lang_datefunc.html
fuente
Time ( 'now', 'localtime' )
y la fecha( 'now', 'localtime' )
funciona.fuente