2009-12-19 16 views
90

estoy tratando de insertar un valor de fecha y hora en una base de datos SQLite. Parece ser sucsessful pero cuando intento para recuperar el valor que hay un error:¿Cómo inserto el valor de fecha y hora en una base de datos SQLite?

<Unable to read data>

Las sentencias SQL son:

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

Respuesta

119

El formato que necesita es:

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

es decir aaaa-mM-dd HH: mm: ss

Si es posible, sin embargo, utilizar una consulta parametrizada ya que esto le libera de tener que preocuparse de una sobre los detalles de formateo.

+0

¿Cómo funciona una orden por fecha con estas cadenas? –

+3

Al formatear fechas como esta, el orden de fecha y el orden léxico funcionan de la misma manera. P.ej. '2008-02-01'> '2007-02-01', '2008-01-02'> '2008-01-01' como cadenas y como fechas. Pero no es necesario que se preocupe por esto porque SQLite ORDER BY se encargará de hacer los pedidos por usted. – itowlson

+5

Tenga en cuenta que no puede comparar las fechas de forma fiable con una precisión diferente utilizando el orden léxico, por ejemplo, "SELECCIONAR" 2007-01-02 10:00:00 '>' 2007-01-02 10:00 '; " devuelve 1 pero "SELECT datetime ('2007-01-02 10:00:00')> datetime ('2007-01-02 10:00');" devuelve 0. – Shane

40

La manera de almacenar fechas en SQLite es:

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

SQLite también tiene algunas funciones de fecha y hora se pueden utilizar. Ver SQL As Understood By SQLite, Date And Time Functions.

+1

FYI, '.xxxxxx' aquí en la sintaxis @ TorValamo =' .SSS' =% f en la documentación de SQLite, es decir, segundos fraccionarios. –

+2

DateTime.parse ('2016-05-28 14:27:00 -0300'). Strftime ('% Y-% m-% d% H:% M:% S') – rodvlopes

16

usted tiene que cambiar el formato de la cadena de fecha está suministrando con el fin de ser capaz de insertar utilizando la función STRFTIME. La razón de ser, no hay ninguna opción para una abreviatura mes:

%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 
%% % 

La alternativa es dar formato a la fecha/hora en un formato ya aceptada:

  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. ahora

Referencia: SQLite Date & Time functions

+0

Aunque no figura en la tabla, los documentos también indican que puede agregar 'Z' o desplazamientos como '-0400' – CoolAJ86

0

esto puede no ser el método más popular y eficiente, pero tienden a renunciar a los tipos de datos fuertes en SQLite SINC e todos ellos son, en esencia, objeto de dumping como cadenas.

He escrito un envoltorio C# delgado alrededor de la biblioteca SQLite antes (cuando se usa SQLite con C#, por supuesto) para manejar inserciones y extracciones hacia y desde SQLite como si estuviera tratando con objetos DateTime.

+0

No lo corta para fechas, por ejemplo querías ordenar por ese campo; terminas con una comparación de cadenas ... – Greg

+2

La comparación de cadenas de fechas funciona bien con el pedido YYYY-MM-DD. – dan04

5

Leer This: 1.2 Date y hora Tipo de datos mejor tipo de datos de fecha y hora tienda es:

TEXT mejor formato es: yyyy-MM-dd HH:mm:ss

Luego leyó this página; esto es lo mejor para explicar la fecha y la hora en SQLite. espero que esto ayudará a

+3

Debería considerar responder a la pregunta, con enlaces que respaldan su respuesta, no solo con un grupo de enlaces –

5

Uso CURRENT_TIMESTAMP cuando lo necesite, en lugar de NOW() (que es MySQL)

+1

, esto funciona, una cosa es incorrecta. CURRENT_TIMESTAMP devuelve datetime sin UTC, ¿sabe cómo resolver este problema? ¡Gracias de antemano! –

Cuestiones relacionadas