IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MS SQL Server Discussion :

Question Datetime vs datetime2


Sujet :

MS SQL Server

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2008
    Messages
    698
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Octobre 2008
    Messages : 698
    Points : 586
    Points
    586
    Par défaut Question Datetime vs datetime2
    Il semble que datetime2 doive remplace datetime à terme, mais...

    J'ai une table de statistiques ou la date et l'heure sont séparées car dans 99% des cas on ne recherche que sur la date ou que sur l'heure.

    Et pour le 1% qui reste je dois reconstruire le Datetime
    le problème / question que j'ai c'est que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    declare @Dt as date = '20130506'
    declare @He as Time = '08:00:00.000'
    Select cast(@dt as datetime)+cast(@He as datetime)
    Fonctionne bien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    declare @Dt as date = '20130506'
    declare @He as Time = '08:00:00.000'
    Select cast(@dt as datetime2)+cast(@He as datetime2)
    Ne fonctionne pas


    Comment le faire avec un Datetime2 ?

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 848
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 848
    Points : 52 964
    Points
    52 964
    Billets dans le blog
    6
    Par défaut
    Il faut utiliser un constructeur de date...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    CREATE TABLE TTT 
    (D DATE,
     H TIME)
     
    INSERT INTO TTT VALUES (GETDATE(), GETDATE())
     
    SELECT *, CAST(CONVERT(CHAR(10), D, 121) + ' ' +
              CONVERT(CHAR(12), H, 121) AS DATETIME2)
    FROM TTT
    À partir de SQL 2012 vous avez des constructeur spécialisés....

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    ou comme ceci, qui n'utilise que des fonctions date :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT DATEADD(
    	ms, 
    	DATEDIFF(ms, 0, @He),
    	cast(@dt AS datetime2)
    )

  4. #4
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    ou comme cela tant qu'à faire en 2012 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT CAST(CONCAT(@Dt, ' ', @He) AS DATETIME2)
    ++

  5. #5
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Ce problème est intéressant en fait. C'est vrai qu'avant cela fonctionnait avec les types de données datetime. Microsoft a décidé de ne pas garder ce comportement pour les nouveaux types de données comme datetime2 et date par exemple.

    Miles Trochesset l'expliquait d'ailleurs bien :

    Ajouter ou soustraire 2 dates --> DATEA -DATEB = ???

    ??? = Une date ? Un nombre d'heure ? Un nombre de secondes

    Même chose pour 1 date + 1 heure --> DATEA + TIMEA = ???

    ??? = Une date ? Une heure ? Une date + une heure ?

    Pour éviter toute ambiguïté il faut effectivement préciser ce que l'on veut à l'aide des fonctions DATEADD ou DATEDIFF ... ce qu'a montré aieeeuuuuu dans son exemple.

    ++

  6. #6
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    C'est vrai que ça évite ce genre de chose...

  7. #7
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2008
    Messages
    698
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Octobre 2008
    Messages : 698
    Points : 586
    Points
    586
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    ou comme ceci, qui n'utilise que des fonctions date :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT DATEADD(
    	ms, 
    	DATEDIFF(ms, 0, @He),
    	cast(@dt AS datetime2)
    )
    J'adore ^^

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 10
    Dernier message: 17/05/2011, 22h45
  2. Question à propos de datetime
    Par rambc dans le forum Général Python
    Réponses: 14
    Dernier message: 15/02/2010, 22h43
  3. [.NET C# VS2005] Question sur DateTime.Substract
    Par NeraOne dans le forum Windows Forms
    Réponses: 1
    Dernier message: 16/05/2007, 11h52
  4. Question de faisabilité
    Par lisarasu dans le forum CORBA
    Réponses: 3
    Dernier message: 14/05/2002, 11h26
  5. [HyperFile] 2 questions de débutant
    Par khan dans le forum HyperFileSQL
    Réponses: 2
    Dernier message: 29/04/2002, 23h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo