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 :

Valeurs à heure fixe


Sujet :

MS SQL Server

  1. #1
    Futur Membre du Club
    Profil pro
    Directeur
    Inscrit en
    Octobre 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Directeur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 6
    Points : 5
    Points
    5
    Par défaut Valeurs à heure fixe
    Bonjour,

    Les données à traitées sont des mesures (température, pression) enregistrées dans une base de données SQL Server avec un horodatage de chaque échantillon. La fréquence est de 1 seconde. Le systême enregistre effectivement à la seconde les valeurs, avec les millisecondes à 0.

    Dans un rapport, il faut mettre ces données (horodatage + échantillon) en forme avec une présentation des valeurs toutes les minutes.
    Les valeurs qui ont les secondes à zéro sont donc extraites avec un clause :

    WHERE DATEPART(SECOND,[Sample_TDate]) = 0

    Sample_TDate Index Sample_Value
    ....
    2012-07-23 01:06:57.000 5 82
    2012-07-23 01:06:58.000 5 83
    2012-07-23 01:06:59.000 5 82
    2012-07-23 01:07:00.000 5 82 <-
    2012-07-23 01:07:01.000 5 83
    2012-07-23 01:07:02.000 5 83
    ...

    Cependant il arrive que l'échantillonnage soit interrompu pendant quelques secondes et il peut y avoir un enregistrement manquant sur le passage à la minute (2012-07-23 01:07:57.000 et valeur 82 dans l'exemple ci dessous)
    Pour contourner ce problème, on considère que la valeur à la minute est la plus récente enregistrée avant cette minute.

    Sample_TDate Signal_Index Sample_Value
    2012-07-23 01:07:56.000 5 79
    2012-07-23 01:07:57.000 5 82 <-
    2012-07-23 01:08:02.000 5 80
    2012-07-23 01:08:03.000 5 79

    Ma question est comment faire dans la requête pour renvoyer la valeur échantillonnée pile sur la minute (secondes = 0 ) ou bien la plus proche en arrière dans le temps à laquelle on donnera l'horodatage sur la minute (2012-07-23 01:08:00.000 dans l'exemple) ?

    Merci

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 391
    Points
    18 391
    Par défaut
    Quelle est votre version de SQL-Server ?

  3. #3
    Futur Membre du Club
    Profil pro
    Directeur
    Inscrit en
    Octobre 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Directeur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    SQL Server 2008 R2

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 391
    Points
    18 391
    Par défaut
    Essayez ainsi :
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    declare @MaTable table (Sample_TDate datetime, Signal_Index int, Sample_Value int);
     
    insert into @MaTable (Sample_TDate, Signal_Index, Sample_Value)
    select '2012-07-23 01:06:57.000', 5, 82 union all
    select '2012-07-23 01:06:58.000', 5, 83 union all
    select '2012-07-23 01:06:59.000', 5, 82 union all
    select '2012-07-23 01:07:00.000', 5, 82 union all
    select '2012-07-23 01:07:01.000', 5, 83 union all
    select '2012-07-23 01:07:02.000', 5, 83 union all
    select '2012-07-23 01:07:56.000', 5, 79 union all
    select '2012-07-23 01:07:57.000', 5, 82 union all
    select '2012-07-23 01:08:02.000', 5, 80 union all
    select '2012-07-23 01:08:03.000', 5, 79;
     
    With Sample_TMP (Sample_TDate, Signal_Index, Sample_Value, ord)
    as
    (
    select Sample_TDate, Signal_Index, Sample_Value
         , case
             when DATEPART(SECOND,[Sample_TDate]) = 0
             then 1
             when Sample_TDate = max(Sample_TDate) over(partition by convert(varchar(16), dateadd(second, 59, Sample_TDate), 121))
             then 2
           end as ord
      from @MaTable
    )
    select Sample_TDate, Signal_Index, Sample_Value
      from Sample_TMP
     where ord is not null;
     
    Sample_TDate            Signal_Index Sample_Value
    ----------------------- ------------ ------------
    2012-07-23 01:07:00.000 5            82
    2012-07-23 01:07:57.000 5            82
    2012-07-23 01:08:03.000 5            79

  5. #5
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    WITH Tmp as (SELECT
    	Sample_TDate , 
    	Sample_Value,
    	rank() OVER (	PARTITION BY ceiling(cast(Sample_TDate as float) * 24 * 60)  
    					ORDER BY ceiling(cast(Sample_TDate as float) * 24 * 60) - cast(Sample_TDate as float) * 24 * 60) as  Rnk
    FROM SampleTable )
    SELECT Sample_TDate , 
    	Sample_Value
    FROM Tmp 
    WHERE Rnk = 1
    Cast en char ou cast en float, pas bien différent ceci dit ...

  6. #6
    Futur Membre du Club
    Profil pro
    Directeur
    Inscrit en
    Octobre 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Directeur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Merci infiniment, ça fonctionne parfaitement.
    Du moins j'ai dû faire cette modification car parfois la valeur sur la minute bascule dans le rang suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT  
    	Sample_TDate , Signal_Index, 
    	Sample_Value, Sample_Qual,
    	(cast(Sample_TDate AS float) * 24 * 60) as ticks ,
    	ceiling(cast(Sample_TDate AS float) * 24 * 60 - 0.001) as [ceiling] ,
    	rank() OVER (	PARTITION BY ceiling(cast(Sample_TDate AS float) * 24 * 60 - 0.001)  
    					ORDER BY ceiling(cast(Sample_TDate AS float) * 24 * 60-0.001) - cast(Sample_TDate AS float) * 24 * 60) AS  Rnk
    FROM P1

Discussions similaires

  1. [Système] Exécution d'un script PHP à heures fixes
    Par Kiyomizu dans le forum Langage
    Réponses: 5
    Dernier message: 26/04/2006, 09h30
  2. Comment envoyer un emailing à heure fixe ?
    Par nath-0-0 dans le forum E-Mailing
    Réponses: 2
    Dernier message: 21/03/2006, 17h30
  3. Tâches routinières à heures fixes !
    Par wishmastah dans le forum Langage
    Réponses: 4
    Dernier message: 18/03/2006, 13h42
  4. [PROCEDURE] déclenchement d'une procédure à heure fixe
    Par Fragonard dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 11/08/2005, 10h03
  5. Lancer une methode a heure fixe
    Par Le Veilleur dans le forum C++Builder
    Réponses: 2
    Dernier message: 27/11/2004, 19h52

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