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

Développement SQL Server Discussion :

Problème curieux avec les dates


Sujet :

Développement SQL Server

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 20
    Points : 16
    Points
    16
    Par défaut Problème curieux avec les dates
    Bonjour
    avec cette table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    CREATE TABLE [dbo].[VPA_PLANNING](
        [IDpla] [int] IDENTITY(100001,1) NOT NULL,
        [dtpla] [smalldatetime] NULL,
        [idcol] [int] NULL,
        [idaff_mat] [int] NULL,
        [idaff_apm] [int] NULL,
    CONSTRAINT [PK_VPA_PLANNING] PRIMARY KEY CLUSTERED
    )
    Je veux une procédure identifiant pour une date dtpla et un ID idcol si idaff_mat ou idaff_apm contient une valeur >0
    (il peut y avoir NULL 0 ou une valeur >1000)
    J'ai la procédure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    dbo.spvpa_adm_planning_sijournoncomplet_test
    @ladate smalldatetime,
    @idcol int
    AS
    select * from vpa_planning 
    where (idaff_mat< 1000 or idaff_apm < 1000) and idcol=@idcol and dtpla=@ladate
    Mais bonjour les problèmes avec la date
    Je teste avec l'interface management studio directement sur la table
    et j'obtient la requête SQL:
    avec comme date le 17 mars 2009 que je note 17/03/2009 et auquel il ajoutte les quotes ( ='17/03/2009')
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT IDpla, dtpla, idcol, idaff_mat, idaff_apm
    FROM dbo.VPA_PLANNING
    WHERE (idcol = 1009) AND (dtpla = CONVERT(DATETIME, '2009-03-17 00:00:00', 102))
    avec le 10 mars noté à l'identique 10/03/2009
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT IDpla, dtpla, idcol, idaff_mat, idaff_apm
    FROM dbo.VPA_PLANNING
    WHERE (idcol = 1009) AND (dtpla = CONVERT(DATETIME, '2009-10-03 00:00:00', 102))
    je suis passé en octobre !
    J'ai essayé avec le type 103 au lieu du 102

    j'ai mis l'expression = CONVERT (DATETIME, '2009-03-10 00:00:00', 103) directement dans le filtre de l'interface en face de dtpla
    et j'obtient l'enregistrement du 3 octobre 2009
    Idem avec le type 102

    Et je ne parle pas des séries. Si je veux les enregistrements du 10/03/2009 au 19/03/2009 ça devient vraiment loufoque.
    J'ai essayé de mettre
    SET DATEFORMAT YMD
    dans ma proceure stockée mais je ne dois pas bien m'y prendre car j'ai des erreurs de convertion
    Je l'ai mis entre la ligne AS et la ligne Select de la procedure stockée
    mais dois-je mettre un GO aprés ?

    Comment être sur que les enregistrements que retourne la requête correspondent bien à ce que l'on a demandé si le système traite différemment les dates inférieures au 13 du mois des autres

    Jusqu'à présent j'ai toujours travaillé avec les dates en les décomposant avec Year() Month() et day()mais je trouve ça un peu lourd et sans doute gourmant en ressources.

    Y a t-il un article de référence sur ce théme, pour les dates et plages de dates transmises en paramètres à une procédure stockée?
    Quel type est le mieux adapté, le datetime, le numérique en donnant la date en seconde ou le varchar en faisant un convert ?

    Par avance merci pour vos pistes et information
    Didier

  2. #2
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Cela fait quelques années que je travaille avec SQL Server et je n'ai jamais eu de tels problèmes.
    CONVERT est une fonction faite pour appliquer un format à une donnée (c'est donc de la pure cosmétique), et non pas pour transformer une chaîne de caractères en date.

    Ainsi vous pouvez laisser SQL Server faire cette transformation en écrivant directement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT IDpla, dtpla, idcol, idaff_mat, idaff_apm
    FROM dbo.VPA_PLANNING
    WHERE idcol = 1009
    AND dtpla = '2009-10-03 00:00:00'
    ou encore en utilisant CAST, ce qui est plus propre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT IDpla, dtpla, idcol, idaff_mat, idaff_apm
    FROM dbo.VPA_PLANNING
    WHERE idcol = 1009
    AND dtpla = CAST('2009-10-03 00:00:00' AS DATETIME)
    Pour les plages de dates je compose avec la clause BETWEEN, qui fonctionne parfaitement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mais dois-je mettre un GO aprés ?
    GO n'est pas une instruction SQL ni T-SQL, c'est une commande de l'utilitaire en ligne de commande OSQL qui est maintenant SQLCMD.
    Elle vous permet d'exécuter dans un script des commandes qui doivent être unique dans leur session d'exécution, comme un CREATE TABLE | TRIGGER | PROCEDURE | FUNCTION.

    Jusqu'à présent j'ai toujours travaillé avec les dates en les décomposant avec Year() Month() et day()mais je trouve ça un peu lourd et sans doute gourmant en ressources.
    Je confirme

    Quel type est le mieux adapté, le datetime, le numérique en donnant la date en seconde ou le varchar en faisant un convert ?
    Pour stocker une date, rien de mieux que le type ... date.
    Vous en avez deux implémentations en T-SQL, qui sont DATETIME (précision à 3ms) et SMALLDATETIME (précision à la minute) jusqu'à SQL Server 2005.

    SQL Server 2008 implémente d'autres types, comme DATE, TIME, DATETIMEOFFSET, ...

    @++

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 20
    Points : 16
    Points
    16
    Par défaut
    Merci pour votre réponse précise et rapide.
    Moi aussi ça fait longtemp que j'utilise SQL et je n'avais pas eu ce genre de problème.
    Je met ça sur le compte de visual management car ce doit être lui qui inverse le mois et le jour quend le jour est inférieur à 13.
    Je le vois tout de suite dans la fenêtre SQL.

    Je vais faire l'essais avec Entreprise Manager sur un autre poste pour voir d'où vient exactement le problème.

    PS : Y a t il un moyen de forcer le getdate() quand il est utilisé pour fournir une valeur par defaut à un champ date de s'affranchir des hh:mm:ss ou de les mettre à 0
    Par momment c'est utile d'avoir l'heure exacte mais par momment ça pose un problème lors des extrtactions.
    encore merci
    Didier

  4. #4
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    PS : Y a t il un moyen de forcer le getdate() quand il est utilisé pour fournir une valeur par defaut à un champ date de s'affranchir des hh:mm:ss ou de les mettre à 0
    Essayez :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE TABLE maTable
    (
    	dateInsertion DATETIME NOT NULL CONSTRAINT DF_maTable_dateInsertion DEFAULT (CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)),
    	valeur INT
    )
    @++

Discussions similaires

  1. problème icompréhensible avec les dates
    Par aaristocat dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 28/08/2009, 11h29
  2. problème requète avec les dates sous sql server
    Par fayabones dans le forum Développement
    Réponses: 2
    Dernier message: 04/06/2009, 22h27
  3. problème avec les dates nulles
    Par shingo dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 30/09/2005, 12h32
  4. [SQL] problème avec les date et les group By
    Par Stef784ever dans le forum Langage SQL
    Réponses: 3
    Dernier message: 23/11/2004, 09h18
  5. Interbase - dbExpress -> problème avec les dates
    Par marghett dans le forum Bases de données
    Réponses: 4
    Dernier message: 02/07/2004, 03h55

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