6
votes

SQLite JDBC Rs.getDate () GetTimeStamp (), etc. Tous renvoient les mauvaises valeurs

Lorsque vous utilisez le JDBC pour SQLite pour une date de raison et que les valeurs horodatées sont stockées correctement dans la DB, sont affichées correctement lors de l'utilisation de l'outil de commande SQLITE3 de ligne de commande, mais lorsque vous utilisez les fonctions ResultSet pour récupérer ces valeurs, cela ne fonctionne pas. Vous trouverez ci-dessous une petite classe de test qui démontre ce que je veux dire.

import java.sql.*;

public class Test {
  public static void main(String[] args) throws Exception {
    Class.forName("org.sqlite.JDBC");
    Connection conn = DriverManager.getConnection("jdbc:sqlite:test.db");
    Statement stat = conn.createStatement();
    stat.executeUpdate("drop table if exists people;");
    stat.executeUpdate("create table people (name, occupation, date date);");
stat.executeUpdate("insert into people values ('Turing', 'Computers', date('now'));");

    ResultSet rs = stat.executeQuery("select * from people;");
    while (rs.next()) {
      System.out.println("name = " + rs.getString("name"));
      System.out.println("job = " + rs.getString("occupation"));
      System.out.println("date = " + rs.getDate("date"));
      System.out.println("dateAsString = " + rs.getString("date"));
    }
    rs.close();
    conn.close();
  }
}


2 commentaires

stat.executeUpdate ("Créer des personnes de table (nom, profession, date de date);"); Essayez de nommer le champ "Date" avec quelque chose d'autre que "Date"?


@Redger j'ai essayé ça, et ça n'a pas fonctionné


3 Réponses :


2
votes

sqlite3 n'a pas de type de date, vous devrez donc avoir la chaîne des dates lors de la rédaction de votre code.

http://www.sqlite.org/dataType3.html


0 commentaires

9
votes

Comme Scott dit: SQLite n'a pas de type de date.

Vous auriez pu avoir SQLite faire la conversion pour vous avec le Strftime Fonction: Strftime ('% s', date) code>. Ensuite, vous pouvez utiliser rs.getdate code> du côté JAVA. P>

Vous pouvez également récupérer la date SQLite en tant que chaîne et analyser en une date: p>

DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
try {
    Date today = df.parse(rs.getString("date"));
    System.out.println("Today = " + df.format(today));
} catch (ParseException e) {
   e.printStackTrace();
}


3 commentaires

C'était la solution que j'ai proposée, mais cela avait l'air joli hacky (je suppose que quelque chose de mieux était disponible "de façon natif"). Je suppose que je vais devoir rester avec ça.


Tout indice que je pourrais forcer la date à être stockée comme un entier (uni-timbre Unix) au lieu d'une chaîne? Je pourrais utiliser du type INT au lieu de la date, mais puis-je spécifier que je veux que la date soit stockée comme int?


Lorsque vous utilisez SetDate et GetDate, jdbc.sqlite le stocke automatiquement comme une longue durée de 64 bits de millisecondes depuis le début de l'époque.



2
votes

SQLite n'utilise pas "Types" et utilise plutôt ce que l'on appelle "Affinité de type";

de la Documentation elle-même:

L'idée importante ici est que le type est recommandé, non requis

Vous pouvez stocker les dates telles que les chaînes et les analyser si vous aimez avec les classes de formatage tels que SimpleDateDormat ou DateTimeformatter date.from (instant.parse (Rs.Getstring ("date"))) .

Java 8

Parmi les autres réponses ici, je voudrais dire que localDate # parse () et localDaTetime # parse () est également une bonne option pour Java 8 en avance de Java 8.

Ils acceptent une date dans Format de chaîne

localDate.parse ("2016-05-24")

ou une chaîne avec un format DateTime comme deuxième argument < p> localdate.parse ("2016-05-24", DateTimeformatter.Ofpattern (AAAA-MM-DD))


Conversion

Et si vous souhaitez utiliser localdate ou localDateTime mais que vous voulez prendre en charge la date , peut-être dans un modèle adaptateur ;

localDaTime à ce jour:

Cet exemple utilise le système temporel par défaut du système comme ZoneID Argument d'AtZone, mais vous pouvez utiliser un fuseau horaire statique / codé dur si vous le souhaitez. Vous créez essentiellement un instant d'Atzone qui peut être utilisé pour créer une date à partir de la méthode statique date de (instant) xxx

localDate à Date:

Cet exemple est à peu près le même, mais tout ce qui est nécessaire pour obtenir une ZoneID afin de créer un instant est la localDate instance elle-même. < Pré> xxx


Je ne suis pas allé dans des détails techniques ici, cela peut ne pas être nécessaire, mais me corrige-moi si je me trompe.


0 commentaires