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(); } }
3 Réponses :
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. P>
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: Vous pouvez également récupérer la date SQLite en tant que chaîne et analyser en une date: p> Strftime ('% s', date) code>. Ensuite, vous pouvez utiliser
rs.getdate code> du côté JAVA. 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();
}
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.
SQLite n'utilise pas "Types" et utilise plutôt ce que l'on appelle "Affinité de type";
de la Documentation elle-même: p>
L'idée importante ici est que le type est recommandé, non requis p> blockQuote>
Vous pouvez stocker les dates telles que les chaînes et les analyser si vous aimez avec les classes de formatage tels que
SimpleDateDormat code> ou
DateTimeformatter vous pouvez utiliser quelque chose de brut comme < code> date.from (instant.parse (Rs.Getstring ("date"))) code>. p>
Java 8 H2>
Parmi les autres réponses ici, je voudrais dire que
localDate # parse () code> et
localDaTetime # parse () code> est également une bonne option pour Java 8 en avance de Java 8. P>
Ils acceptent une date dans Format de chaîne p>
localDate.parse ("2016-05-24") code> p>
ou une chaîne avec un format DateTime comme deuxième argument P> < p>
localdate.parse ("2016-05-24", DateTimeformatter.Ofpattern (AAAA-MM-DD)) CODE> P>
Conversion H2>
Et si vous souhaitez utiliser
localdate code> ou
localDateTime code> mais que vous voulez prendre en charge la date code>, peut-être dans un modèle
adaptateur fort> ; p> localDaTime à ce jour: h2>
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) code> p>
xxx pré> localDate à Date: h2>
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 code> instance elle-même. P> < Pré> xxx pré>
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. P> p>
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é