Como faço para inserir o valor de data e hora em um banco de dados SQLite?

109

Estou tentando inserir um valor de data e hora em um banco de dados SQLite . Parece ser bem sucedido, mas quando tento recuperar o valor, ocorre um erro:

<Incapaz de ler os dados>

As instruções SQL são:

create table myTable (name varchar(25), myDate DATETIME)
insert into myTable (name,mydate) Values ('fred','jan 1 2009 13:22:15')
Brad
fonte

Respostas:

153

O formato que você precisa é:

'2007-01-01 10:00:00'

ou seja, aaaa-MM-dd HH: mm: ss

Se possível, no entanto, use uma consulta parametrizada, pois isso o livra de se preocupar com os detalhes de formatação.

Itowlson
fonte
Como fazer um pedido por data com essas strings?
IgorGanapolsky
3
Quando você formata datas dessa forma, a ordem das datas e a ordem lexical funcionam da mesma forma. Por exemplo, '2008-02-01'> '2007-02-01', '2008-01-02'> '2008-01-01' tanto como strings quanto como datas. Mas você não precisa se preocupar estritamente com isso porque o SQLite ORDER BY cuidará dos pedidos para você.
itowlson
7
Observe que não é possível comparar datas com precisão diferente usando ordenação lexical, por exemplo, "SELECT '2007-01-02 10:00:00'> '2007-01-02 10:00';" retorna 1, mas "SELECT datetime ('2007-01-02 10:00:00')> datetime ('2007-01-02 10:00');" retorna 0.
Shane
@itowlson Como isso funcionará quando você tiver um aplicativo multilíngue?
batmaci
46

A maneira de armazenar datas no SQLite é:

 yyyy-mm-dd hh:mm:ss.xxxxxx

O SQLite também possui algumas funções de data e hora que você pode usar. Consulte SQL como compreendido por SQLite, funções de data e hora .

Tor Valamo
fonte
3
Para sua informação, .xxxxxxaqui na sintaxe de @TorValamo = .SSS=% f na documentação do SQLite, isto é, segundos fracionários.
Flak DiNenno
2
DateTime.parse ('2016-05-28 14:27:00 -0300'). Strftime ('% Y-% m-% d% H:% M:% S')
rodvlopes
17

Você deve alterar o formato da string de data que está fornecendo para poder inseri-la usando a função STRFTIME. O motivo é que não há opção para a abreviatura de um mês:

%d  day of month: 00
%f  fractional seconds: SS.SSS
%H  hour: 00-24
%j  day of year: 001-366
%J  Julian day number
%m  month: 01-12
%M  minute: 00-59
%s  seconds since 1970-01-01
%S  seconds: 00-59
%w  day of week 0-6 with sunday==0
%W  week of year: 00-53
%Y  year: 0000-9999
%%  % 

A alternativa é formatar a data / hora em um formato já aceito:

  1. AAAA-MM-DD
  2. AAAA-MM-DD HH: MM
  3. AAAA-MM-DD HH: MM: SS
  4. AAAA-MM-DD HH: MM: SS.SSS
  5. AAAA-MM-DDTHH: MM
  6. AAAA-MM-DDTHH: MM: SS
  7. AAAA-MM-DDTHH: MM: SS.SSS
  8. HH: MM
  9. HH: MM: SS
  10. HH: MM: SS.SSS
  11. agora

Referência: funções SQLite Data e Hora

Pôneis OMG
fonte
Embora não esteja listado na tabela, os documentos também afirmam que você pode adicionar 'Z' ou deslocamentos como '-0400'
coolaj86
10

Use CURRENT_TIMESTAMPquando precisar, em vez de OF NOW()(que é MySQL)

congelando_
fonte
1
isso funcionou, uma coisa está errada. CURRENT_TIMESTAMP data e hora do retorno sem UTC, você sabe como resolver esse problema. Desde já, obrigado!
Ulug'bek Ro'zimboyev
8

Leia isto : 1.2Date e Time Datatype O melhor tipo de dados para armazenar data e hora é:

TEXT o melhor formato é: yyyy-MM-dd HH:mm:ss

Então leia esta página; esta é a melhor explicação sobre data e hora em SQLite. Espero que isso lhe ajude

Ali Amanzadegan
fonte
5
Você deve responder à pergunta, com links que apóiem ​​sua resposta, não apenas um monte de links
Gonzalo.-
0

Este pode não ser o método mais popular ou eficiente, mas eu tendo a renunciar a tipos de dados fortes no SQLite já que todos eles são essencialmente despejados como strings de qualquer maneira.

Eu escrevi um wrapper fino C # em torno da biblioteca SQLite antes (ao usar SQLite com C #, é claro) para lidar com inserções e extrações de e para SQLite como se estivesse lidando com objetos DateTime.

Bagunçado
fonte
Não corta para datas se, por exemplo, você quiser classificar por esse campo; você acaba com uma comparação de string ...
G__