Eu tenho uma tabela sqlite (v3) com esta definição de coluna:
"timestamp" DATETIME DEFAULT CURRENT_TIMESTAMP
O servidor em que este banco de dados reside está no fuso horário CST. Quando insiro em minha tabela sem incluir a coluna de carimbo de data / hora, o sqlite preenche automaticamente esse campo com o carimbo de data / hora atual em GMT, não CST.
Existe uma maneira de modificar minha instrução de inserção para forçar o carimbo de data / hora armazenado em CST? Por outro lado, provavelmente é melhor armazená-lo em GMT (no caso de o banco de dados ser movido para um fuso horário diferente, por exemplo), então há uma maneira de modificar meu SQL selecionado para converter o carimbo de data / hora armazenado em CST quando eu extraí-lo da mesa?
Respostas:
Encontrei na documentação do sqlite ( https://www.sqlite.org/lang_datefunc.html ) este texto:
Isso não parecia atender às minhas necessidades, então tentei mudar um pouco a função "data e hora" e acabei com o seguinte:
Isso parece funcionar - é a maneira correta de converter para o seu fuso horário ou existe uma maneira melhor de fazer isso?
fonte
simplesmente use a hora local como padrão:
fonte
Você deve, como regra, deixar carimbos de data / hora no banco de dados em GMT e apenas convertê-los de / para a hora local na entrada / saída, quando puder convertê-los para o carimbo de data / hora local do usuário (não do servidor).
Seria bom se você pudesse fazer o seguinte:
... para gerar o carimbo de data / hora para um usuário no horário de verão do Pacífico. Infelizmente, isso não funciona. De acordo com este tutorial SQLite , no entanto (role para baixo até "Outros comandos de data e hora"), você pode solicitar a hora e, em seguida, aplicar um deslocamento (em horas) ao mesmo tempo. Então, se você sabe a diferença de fuso horário do usuário, você está bem.
Não lida com as regras de horário de verão ...
fonte
No (raro admitido) caso em que um datatime local é desejado (eu, por exemplo, armazeno o horário local em um dos meus bancos de dados, pois tudo que me importa é que hora do dia é e não mantenho o controle de onde eu estava em termos de fusos horários ...), você pode definir a coluna como
A parte% Y-% m-% dT% H:% M é obviamente opcional; é apenas como gosto que meu tempo seja armazenado. [Além disso, se minha impressão estiver correta, não há tipo de dados "DATETIME" em sqlite, então realmente não importa se TEXT ou DATETIME é usado como tipo de dados na declaração da coluna.]
fonte
Ao ter uma coluna definida com "
NOT NULL DEFAULT CURRENT_TIMESTAMP
," os registros inseridos sempre serão configurados com o horário UTC / GMT.Aqui está o que fiz para evitar a necessidade de incluir a hora em minhas instruções INSERT / UPDATE:
Teste para ver se funciona ...
Espero que ajude.
fonte
fonte
SELECT datetime(CURRENT_TIMESTAMP, 'localtime')
fonte
Você também pode simplesmente converter a coluna de tempo em um carimbo de data / hora usando strftime ():
Da-te:
A coluna da tabela 'timestamp' pode ser um campo de texto mesmo, usando
current_timestamp
como DEFAULT.Sem strftime:
Da-te:
fonte
Eu acho que isso pode ajudar.
fonte
A hora atual, no fuso horário da sua máquina:
De acordo com http://www.sqlite.org/lang_datefunc.html
fonte
Time ( 'now', 'localtime' )
e Data( 'now', 'localtime' )
funciona.fonte