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èmes de date


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Inscrit en
    Novembre 2009
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 3
    Par défaut Problèmes de date
    Bonjour à tous,
    je travaille avec SQL server 2003. je souhaiterai aprés avoir fait la différence entre 2 dates, de format DateTime, pouvoir afficher le résultat sur une nouvelle colonne sous la forme yyyy-mm-dd hh:mm:ss.
    J'ai essaye avec Date_Format mais je n'obtient pas ce resultat.

    Voici ma requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT
    Convert(nvarchar(23),b.Log_Open,120) as debut,
    Convert(nvarchar(23),d.DateTime,120) as fin,
    ABS(DateDiff(s,b.Log_Open,d.DateTime)) as durée
    FROM b.DetailLogID, d.PhaseInstanceID
    j'obtiens comme résultat une table telle que

    debut 2009-11-11 13:21:33
    fin 2009-11-11 13:22:53
    durée 80


    Pourriez-vous m'aider? Merci

  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 : 44
    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
    Par défaut
    Bonjour,

    Vous voulez dire que vous souhaitez afficher 80s au format aaaa-mm-jj hh:mi:ss ?

    Pourquoi utilisez-vous NVARCHAR ? Les dates ne contiennent pas de caractères non-latins, et pour chaque caractère, vous utilisez donc deux octets au lieu d'un en VARCHAR, qui utilise le jeu de caractères ASCII ...

    FROM b.DetailLogID, d.PhaseInstanceID.
    Je ne vois pas de jointure dans votre requête ...
    Utilisez pour cela le mot-clé JOIN

    @++

  3. #3
    Futur Membre du Club
    Inscrit en
    Novembre 2009
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 3
    Par défaut
    Vous avez raison pour la jointure. je l'ai oublié lors de ma transcription. Je viens d'utiliser le fonction 'SEC_TO_TIME' et j'ai comme erreur que ce n'est pas une fonction reconnu.
    C'est vrai que mon problème est de passer 80 sec en format 'hh:mm:ss' en mettant l'exigence de la date de coté.

  4. #4
    Membre Expert

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Août 2007
    Messages : 1 216
    Par défaut
    Voici un lien vers un article traitant de votre problematique: http://www.sqlteam.com/article/worki...-in-sql-server

  5. #5
    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 : 44
    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
    Par défaut
    Bonjour,

    Si votre besoin est de n'avoir seulement qu'une représentation de la différence de temps entre les deux dates, vous pouvez par exemple utiliser une fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    -----------------------------------------------------------------
    -- Retourne une représentation de secondes sous la forme HH:mm:ss
    -----------------------------------------------------------------
    CREATE FUNCTION FnSecToTime
    	(@_secondes INT)
    	RETURNS CHAR(8)
    	WITH SCHEMABINDING
    AS
    BEGIN
    	RETURN CASE LEN(@_secondes / 3600)
    			WHEN 1 THEN '0' + CAST(@_secondes / 3600 AS CHAR(1))
    			ELSE CAST(@_secondes / 3600 AS CHAR(2))
    		END + ':' +
    		CASE LEN(@_secondes / 60) % 60
    			WHEN 1 THEN '0' + CAST((@_secondes / 60) % 60 AS CHAR(1))
    			ELSE CAST((@_secondes / 60) % 60 AS CHAR(2))
    		END + ':' +
    		CASE LEN(@_secondes % 60)
    			WHEN 1 THEN '0' + CAST(@_secondes % 60 AS CHAR(1))
    			ELSE CAST(@_secondes % 60 AS CHAR(2))
    		END	
    END
    Voici un exemple d'utilisation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT dbo.FnSecToTime(4562)
    qui retourne, sous forme de chaîne de caractères : 01:16:02
    Vous pouvez passer en argument à cette fonction une colonne de votre table, ou directement votre DATEDIFF :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT dbo.FnSecToTime(DATEDIFF(second, b.Log_Open, d.DATETIME))
    N'utilisez jamais comme nom de colonne le nom d'un type de données

    Vous pouvez aussi utiliser une vue pour vous faire les calculs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE VIEW maVue
    AS
    SELECT CONVERT(VARCHAR(19), b.Log_Open, 120) AS debut,
    		CONVERT(VARCHAR(19), d.datetime,120) AS fin,
    		dbo.FnSecToTime(ABS(DATEDIFF(second, b.Log_Open, d.DateTime))) AS duree
    FROM b.DetailLogID
    INNER JOIN d.PhaseInstanceID
    	ON b.uneColonneDeB = d.PhaseInstanceID
    et pour l'exploiter dans votre requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT debut, fin, duree
    FROM dbo.maVue
    @++

  6. #6
    Futur Membre du Club
    Inscrit en
    Novembre 2009
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 3
    Par défaut
    Merci, ca fonctionne trés bien.

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

Discussions similaires

  1. Problème de date dans requête de màj imbriquée
    Par VirginieGE dans le forum Langage SQL
    Réponses: 11
    Dernier message: 20/07/2004, 15h34
  2. problème de date
    Par baboune dans le forum PostgreSQL
    Réponses: 8
    Dernier message: 10/06/2004, 10h52
  3. Problème de date dans MONTHS_BETWEEN
    Par ghostlord79 dans le forum Oracle
    Réponses: 10
    Dernier message: 07/04/2004, 11h21
  4. Problème conversion date
    Par mat.M dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 30/03/2004, 15h05
  5. Encore un probléme de date avec TADO !
    Par bNoureddine dans le forum Bases de données
    Réponses: 2
    Dernier message: 22/02/2004, 18h22

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