2012-08-30 4 views
1

J'ai regardé autour et ne pouvais pas sembler trouver ceci demandé spécifiquement, sur SO, mais j'ai trouvé des questions similaires comme this one et beaucoup de questions concernant SQL lui-même ou C# ...sql serveur jdbc requête sur datetime colonne

Voici ce que je vois:

MapSqlParameterSource parameterSource = new MapSqlParameterSource(); 
     //parameterSource.addValue("insertDate", DateTime.now().minusHours(1).toGregorianCalendar(), Types.TIME); 
     parameterSource.addValue("insertDate", new Timestamp(DateTime.now().minusHours(1).getMillis())); 

     List<String> contents = 
      _simpleJdbcTemplate 
       .query(
        "SELECT TOP (200) inserteddatetime, Contents FROM dbo.tsomeTable WHERE (ServiceName = 'something') and inserteddatetime > :insertDate", 
        new RowMapper<String>() { 
         @Override 
         public String mapRow(final ResultSet rs, final int rowNum) throws SQLException { 
          System.out.println(rs.getTimestamp("inserteddatetime")); 

          return rs.getString("Contents"); 
         } 
        }, parameterSource); 

la requête "gèlera" \ ne fait rien \ ne retourne jamais si:

  1. J'utilise le décommentée objet Timestamp (tel que présenté ci-dessus)
  2. je remplace l'objet parameterSource avec DateTime.now().minusHours(1).toGregorianCalendar() ou DateTime.now().minusHours(1).toGregorianCalendar().getTime()
  3. je tente la ligne en commentaire, mais changer le type de Timestamp

Alors, voici ma question ou des questions ...

Est y-a-t-il un problème \ bug connu avec l'interrogation des colonnes datetime dans le serveur sql? Pourquoi dois-je utiliser Time et non Timestamp?

Je soupçonne que Spring convertit les objets de date sur Timestamp lorsque j'interroge directement l'objet (comme démontré dans # 2).

+0

J'ai développé plusieurs applications soutenues par SQLServer 2005/2008 et les requêtes/colonnes date/heure fonctionnent bien. Il sera utile d'inclure le ddl que vous avez utilisé pour créer la table (pour le type de colonne de insertedDatetime). – philwb

+0

Les sons suspendus/ne revenant jamais me suspectent. Pouvez-vous exécuter une trace Sql Server et voir ce qu'il fait? http://msdn.microsoft.com/en-us/library/ms175047.aspx En outre, pouvez-vous confirmer que vous utilisez une colonne datetime avec insertDate et pas TIMESTAMP? – pd40

Répondre

0
  1. TIMESTAMP est une valeur générée par le serveur utilisé pour aider à data consistency, ne est pas un type de données simple, donc pour storing datetime value, éviter timestamp. En outre, SQL Server TIMESTAMP est confusing et deprecated. Il est remplacé par le ROWVERSION keyword, ce qui devrait réduire la confusion.