J'ai une statistique très spécifique que j'ai besoin d'obtenir des informations de.
C'est une suite à partir de cette question, qui vient de demander à environ 4 heures du matin, j'ai maintenant besoin d'ajouter aussi que c'était un mardi p> Comment obtenir combien d'heures 4am y a-t-il eu entre deux dates de TSQL P> J'ai besoin de déterminer combien d'occurrences d'une période donnée sur une journée sur un Jour particulier de la semaine, il y a eu entre deux dates. P> Par exemple, j'ai besoin d'obtenir combien de 4 heures du mardi il y a eu deux dates. P> Par exemple. , ce qui suit donnerait le résultat = 1 car il y a 1 occurrence de 4 heures du mardi p> comme exemple, ce qui suit donnerait le résultat = 0, car il y a eu 0 4hams un mardi p> à titre d'exemple, ce qui suit donnerait le résultat = 2 car il y a eu 2 4 heures P> SET DATEFIRST 1
declare @HourOfDay int = 4
declare @tests table (
date1 datetime,
date2 datetime
)
INSERT INTO @tests VALUES
('2019-10-01 00:00:00.000', '2019-10-02 00:00:00.000'), -- returns 1 CORRECT
('2019-10-01 05:00:00.000', '2019-10-02 00:00:00.000'), -- returns 1 INCORRECT
('2019-10-01 03:00:00.000', '2019-10-08 05:00:00.000'), -- returns 2 CORRECT
('2019-10-01 04:00:00.000', '2019-10-08 04:00:00.000'); -- returns 2 CORRECT
select
date1,
date2,
DATEDIFF(DAY,DATEADD(SECOND,-1,DATEADD(HOUR, -1 * @HourOfDay, date1)),DATEADD(HOUR, -1 * @HourOfDay, date2)) / 7 + 1
from @tests
3 Réponses :
Je suggérerais une table de calendrier, mais vous pouvez utiliser une table Tally / numéros ad-hoc, aussi bien
dans la sous-requête B, nous créons une table de calendrier à la volée de 10 000 jours à partir de 2015-12. -31. Vous pouvez ajuster ou rendre dynamique fort> p> renvoie forte > p>
Merci pour votre exemple, je serais intéressé par vos pensées sur ma solution, en cours d'exécution dans le plan d'exécution que vous sélectionnez 88%, tandis que la mine ne coûte que 3%, si le mien est suffisant, je préférerais utiliser la solution plus efficace. Mais seulement si c'est correct
@ user3284707 Si vous ressemblez à votre solution est parfaitement valide. J'essaie juste d'éviter les calculs / girays de la date (je manque toujours quelque chose.) En outre, je soupçonne qu'un calendrier ou une table de chiffres réels serait plus performant que ma table Tally ad-hoc.
J'ai trouvé une solution qui semble fonctionner pour mes cas de test. Je dois faire plus de tests encore cependant.
Je serais intéressé à entendre si quelqu'un pense que ma logique est incorrecte p>
Essayez ceci:
SET DATEFIRST 1
declare @HourOfDay int = 4
declare @weekday int=2
declare @tests table (
date1 datetime,
date2 datetime
)
INSERT INTO @tests VALUES
('2019-10-01 00:00:00.000', '2019-10-02 00:00:00.000'),
('2019-10-01 05:00:00.000', '2019-10-02 00:00:00.000'),
('2019-10-01 03:00:00.000', '2019-10-08 05:00:00.000'),
('2019-10-01 04:00:00.000', '2019-10-08 04:00:00.000'),
('2019-10-03 04:00:00.000', '2019-10-11 02:00:00.000'),
('2019-10-03 04:00:00.000', '2019-10-15 04:00:00.000'),
('2019-10-03 04:00:00.000', '2019-10-15 02:00:00.000');
;WITH cte(date1,date2,dt1,dt2)
AS
(
select
date1,
date2,
CASE WHEN datepart(weekday,date1)=@weekday AND datepart(hour,date1)<=@HourOfDay THEN 1 ELSE 0 END,
CASE WHEN datepart(weekday,date2)=@weekday AND datepart(hour,date2)>=@HourOfDay THEN 1 ELSE 0 END
FROM @tests
)
select
date1,
date2,
dt1+dt2+DATEDIFF(DAY,DATEADD(DAY,dt1,date1),DATEADD(DAY,0-dt2,date2))/7
from cte
Je pense que c'est exactement ce que je cherche, merci beaucoup - ma solution ne fonctionnait pas sur quelques autres tests que je l'ai fait vraiment apprécier votre aide
N'est-ce pas efficacement ce que vous avez demandé ici: Stackoverflow.com/Questtions/58447516/...
Très similaire ... j'ai accidentellement oublié que j'en ai besoin pour un jour spécifique de la semaine, la question est donc différente.
Au moins, alors montrez vos tentatives (en utilisant ma réponse précédente, je suppose) et laissez les gens savoir que c'est une question de suivi. Ne changez pas seulement le poteau de but et ne vous montrerez pas au moins essayé i> de mettre en œuvre la solution que vous devez déjà remplir vos exigences nouvelles i> ..
Toutes mes excuses, j'ai mis mes tentatives maintenant pour faire ce travail, désolé j'aurais dû ajouter ceci au début, j'avais essayé mais j'ai échoué