Bonjour,

Je suis en train d'essayer de supprimer une partie de l'entrée manuelle dans plusieurs requêtes qui récupèrent un volume hebdomadaire de résultats qui ont été transmis via nos interfaces. À savoir la fonction date-heure et plusieurs fonctions de cas. Je voulais d'abord gérer la date et l'heure, car les déclarations de cas n'ont pas besoin d'être mises à jour chaque semaine, uniquement lorsqu'un nouveau client est ajouté.

Dans le passé, nous avons modifié manuellement les données pour sélectionner les sept derniers jours de données.

Exemple:

    WHERE (MessageReceivedDateTime >= '12/23/15 05:00' 
    AND MessageReceivedDateTime < '12/28/15 05:00') 

J'ai pu utiliser le code proposé ci-dessous pour récupérer les 7 derniers jours de données dans notre base de données et il semble que certaines valeurs manquent sur l'un des jours. Je suppose que c'est parce que je n'ai pas le décalage horaire dans la requête.

Proposé:

    (MessageReceivedDateTime between DateAdd(DD,-7,GETDATE() ) and GETDATE()) 

Une partie de l'objectif de la mise à jour était de nous assurer que nous n'avions pas besoin de modifier manuellement la date et l'heure sur une base hebdomadaire. J'ai fait une recherche sur Google et parcouru le forum, mais je n'ai rien vu de spécifique à cette question. Toute aide / explication supplémentaire serait grandement appréciée.

Je tiens également à m'excuser à l'avance si j'ai mal sélectionné tSQL, ma formation SQL a été effectuée et nous avons à la fois Oracle et Microsoft SQL Server Management Studio, j'exécute les requêtes ci-dessus dans Management Studio et je pense qu'il s'agit de tSQL.

---- Modifier pour fournir la solution finale ----

    DECLARE @StartTime DATETIME = (DATEADD(Day, 0, DATEDIFF(Day, 0, GetDate())-7));
    DECLARE @EndTime DATETIME = DATEADD(Day, 0, DATEDIFF(Day, 0, GetDate()));
   SET @StartTime = DATEADD(hh,(-dbo.fn_GetUTCOffset(@StartTime)),@StartTime);
   SET @EndTime = DATEADD(hh,(-dbo.fn_GetUTCOffset(@EndTime)),@EndTime);

    WHERE MessageReceivedDateTime >= @StartTime
           AND MessageReceivedDateTime < @EndTime

Dans mon cas particulier, la seule chose dont je dois m'inquiéter le dernier jour est de m'assurer de tenir compte de mon décalage UTC. Ce que j'ai géré avec le -dob.fn que nous avons mis en place. Il en ajoutera 5 ou 4 selon la période de l'année.

0
J. E. Flint 30 déc. 2015 à 19:41

2 réponses

Meilleure réponse

La fonction GETDATE renvoie un DATETIME qui est pour NOW. Soustraire 7 jours, comme vous l'avez fait, reviendra avec la date d'il y a 7 jours, mais l'heure d'aujourd'hui.

EXEMPLE: MAINTENANT : 30/12/2015 12: 37: 45.143 DateAdd - 7 : 23/12/2015 12: 37: 45.143

Si vous souhaitez une heure précise de la journée, vous devrez faire un peu plus de travail.

DECLARE @MyTime TIME = '05:15'  --This can be changed to whatever time you would like.
DECLARE @StartTime DATETIME = CONVERT(VARCHAR(10), CAST(GETDATE() AS DATE)) + ' ' + CONVERT(VARCHAR(10), @MyTime)
DECLARE @EndTime DATETIME = CONVERT(VARCHAR(10), CAST(DATEADD(DAY, -7, GETDATE()) AS DATE)) + ' ' + CONVERT(VARCHAR(10), @MyTime)

Il peut être utilisé dans la clause where de votre requête comme

  (MessageReceivedDateTime between @StartTime and @EndTime)
1
Steven 30 déc. 2015 à 18:38

Vous pouvez corriger votre deuxième requête en la convertissant en date pour supprimer le composant de temps:

(MessageReceivedDateTime between DateAdd(day, -7, CAST(GETDATE() as DATE)) and 
                                 CAST(GETDATE() as DATE)
) 

Cependant, je n'utiliserais pas between pour cela. Quelque chose de plus comme:

(MessageReceivedDateTime >= DateAdd(day, -7, CAST(GETDATE() as DATE))
 MessageReceivedDateTime < CAST(GETDATE() as DATE)
) 

Je ne sais pas quelles sont les limites des valeurs, vous pouvez donc ajouter ou soustraire "1".

0
Gordon Linoff 30 déc. 2015 à 16:47