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

Contribuez SQL Server Discussion :

pour la FAQ : conversion en DATETIME pour heure et date en INT


Sujet :

Contribuez SQL Server

  1. #1
    Expert éminent Avatar de 7gyY9w1ZY6ySRgPeaefZ
    Homme Profil pro
    dba
    Inscrit en
    juillet 2007
    Messages
    4 857
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : juillet 2007
    Messages : 4 857
    Points : 6 251
    Points
    6 251
    Par défaut pour la FAQ : conversion en DATETIME pour heure et date en INT
    Sous MS SQL Server 2005, quand on consulte les tables systèmes relatives aux jobs, on a les dates et heures sous format INT (!!!?).
    Voici une façon de récupérer la conversion en DATETIME.

    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
    select last_run_date 
    	, last_run_time 
    	, convert( datetime, convert( varchar , last_run_date ), 112 ) 
    		+ convert( datetime, stuff( stuff( 
    				replicate ('0', 6 - len (convert(varchar, last_run_time )) ) 
    				+ convert(varchar, last_run_time )
    			 , 3, 0 , ':') , 6, 0 , ':' ) , 108) last_run_datetime
    from msdb.dbo.sysjobservers 
     
    last_run_date last_run_time last_run_datetime
    ------------- ------------- -----------------------
    20080824      235506        2008-08-24 23:55:06.000
    20100517      111326        2010-05-17 11:13:26.000
    20101028      73003         2010-10-28 07:30:03.000
    20101028      14000         2010-10-28 01:40:00.000
    20101028      100           2010-10-28 00:01:00.000
    20101028      0             2010-10-28 00:00:00.000
    C'est sûr que ce n'est pas quelque chose qui requiert beaucoup de compétence, juste de la rigueur, on est d'accord, mais si ça permet à certain de gagner 20 minutes, c'est toujours ça de pris...
    Et en plus, ça fera un endroit où je pourrais retrouver ma bidouille !

    Il doit y avoir plus performant et il est aussi possible de mettre ça dans une fonction, mais pour mon besoin du moment, je n'ai pas besoin d'aller plus loin aujourd'hui.

  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
    19 472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : mai 2002
    Messages : 19 472
    Points : 46 225
    Points
    46 225
    Par défaut
    Plus simple : CAST(CURRENT_TIMESTAMP AS FLOAT)
    donne un réel dont la partie entière est le nombre de jours depuis 1/1/1900 et la partie décimale le nombre de fraction de jours que l'on peut convertir en heure, minute ou seconde décimales....

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    WITH T AS 
    (SELECT CAST(CURRENT_TIMESTAMP AS FLOAT) AS H)
    SELECT CAST(CAST(FLOOR(H) AS DATETIME) AS DATE) AS JOUR, 
           (H - FLOOR(H)) * 1440 AS HEURE_DECIMALE FROM T
    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...
    * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *

  3. #3
    Expert éminent Avatar de 7gyY9w1ZY6ySRgPeaefZ
    Homme Profil pro
    dba
    Inscrit en
    juillet 2007
    Messages
    4 857
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : juillet 2007
    Messages : 4 857
    Points : 6 251
    Points
    6 251
    Par défaut
    Ce que tu nous montre ne fonctionne pas directement dans le cas des tables genre msdb.dbo.sysjobservers , car les heures dans le INT ne sont pas des "vraies" secondes, c'est en fait un formatage de type 'HHMISS' stocké dans un INT...
    Si c'est pas pervers...

  4. #4
    Modérateur

    Homme Profil pro
    Consultant Teradata
    Inscrit en
    septembre 2008
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Teradata

    Informations forums :
    Inscription : septembre 2008
    Messages : 7 920
    Points : 15 835
    Points
    15 835
    Par défaut
    On peut raccourcir ce bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    replicate ('0', 6 - len (convert(varchar, last_run_time )))
     + convert(varchar, last_run_time)
    En celui-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    right(cast(1000000 + last_run_time as varchar), 6)

  5. #5
    Expert éminent Avatar de 7gyY9w1ZY6ySRgPeaefZ
    Homme Profil pro
    dba
    Inscrit en
    juillet 2007
    Messages
    4 857
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : juillet 2007
    Messages : 4 857
    Points : 6 251
    Points
    6 251
    Par défaut
    Merci Waldar.

    Ça donne donc ça en version 1.1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT last_run_date 
      , last_run_time 
      , convert( datetime, convert( varchar , last_run_date ), 112 ) 
    	+ convert( datetime, stuff( stuff( 
    		RIGHT(cast(1000000 + last_run_time AS varchar), 6)
    		 , 3, 0 , ':') , 6, 0 , ':' ) , 108) last_run_datetime
    FROM msdb.dbo.sysjobservers

  6. #6
    Expert éminent Avatar de 7gyY9w1ZY6ySRgPeaefZ
    Homme Profil pro
    dba
    Inscrit en
    juillet 2007
    Messages
    4 857
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : juillet 2007
    Messages : 4 857
    Points : 6 251
    Points
    6 251
    Par défaut
    Version 1.2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT last_run_date 
      , last_run_time 
    	, case when last_run_date = 0 and last_run_time = 0 then null else  
    		convert( datetime, convert( varchar , last_run_date ), 112 ) 
    		+ convert( datetime, stuff( stuff( 
    			RIGHT(cast(1000000 + last_run_time AS varchar), 6)
    			 , 3, 0 , ':') , 6, 0 , ':' ) , 108) end last_run_datetime
    FROM msdb.dbo.sysjobservers

  7. #7
    Modérateur

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

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : janvier 2010
    Messages : 5 441
    Points : 12 588
    Points
    12 588
    Par défaut
    bonjour,

    une autre approche, avec la manip pour la durée en prime, tirée d'un post de cette semaine http://www.developpez.net/forums/d10...convert-stuff/

    Code SQL : 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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    SELECT 
    	S.server_id AS nserveur, 
    	S.last_outcome_message AS message,
    	J.name,  
    	DATEADD(
    		SECOND,
    		(Last_run_time % 10000) % 100,
    		DATEADD(
    			MINUTE,
    			(Last_run_time % 10000) / 100, 
    			DATEADD(
    				HOUR, 
    				Last_run_time / 10000, 
    				CAST(
    					CAST(
    						last_run_date 
    						AS VARCHAR(8)
    					) 
    				AS DATETIME
    				)
    			)
    		)
    	)AS date_heure_derniere_execution, 
    	CASE 
    		WHEN last_run_duration / 10000 < 10 
    			THEN '0' 
    		ELSE '' 
    	END 
    	+ CAST(
    		last_run_duration / 10000 
    		AS VARCHAR(10)
    	) 
    	+ ':' 
    	+ RIGHT(
    		'0'
    		+ CAST(
    			(last_run_duration % 10000) / 100 
    			AS VARCHAR(10)
    		)
    		, 2
    	) 
    	+ ':' 
    	+ RIGHT(
    		'0' 
    		+ CAST(
    			(last_run_duration % 10000) % 100 
    			AS VARCHAR(10)
    		)
    		,2
    	) AS duree
    FROM sysjobservers S
    INNER JOIN sysjobs J ON J.job_id = S.job_id

Discussions similaires

  1. Réponses: 3
    Dernier message: 15/10/2010, 06h02
  2. Utilisation de DateTime pour comparer des heures.
    Par Setsuna_00 dans le forum Modules
    Réponses: 3
    Dernier message: 03/02/2010, 13h56
  3. Conseils pour l'écriture de questions/réponses pour les FAQ
    Par LittleWhite dans le forum Contribuez
    Réponses: 0
    Dernier message: 18/05/2006, 20h15

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