2009-09-22 9 views
0

J'ai une procédure stockée qui boucle les mois de l'exercice et comptabilise les éléments de chaque mois. Je sais pertinemment qu'il y a 176 items, mais quand je lance ça ça retourne un total de 182. J'ai essayé de supprimer une seconde de @EndDate, mais mon compte total était de 165. Donc je compte soit deux fois les items, soit sans compter tous. Quelqu'un peut-il aider avec ce que je fais mal ici? Voici une version allégée de ce que je fais:Problème avec la requête Sql Server utilisant BETWEEN dans lequel DATETIME

DECLARE @Date DATETIME 
DECLARE @EndDate DATETIME 

SELECT @Date = CAST((@Year - 1) as VARCHAR) + '-07-01' 
SELECT @EndDate = DATEADD(Month, 1, @Date) 


DECLARE @Count INT 
SELECT @Count = 0 
WHILE @Count < 12 

BEGIN 

    SELECT 
     COUNT(yai.ID) 
    FROM 
     table_1 yai 
     INNER JOIN table_2 yat ON yai.ID = yat.ID 
    WHERE 
     (yat.Date_Received BETWEEN CONVERT(VARCHAR, @Date, 101) AND CONVERT(VARCHAR, @EndDate, 101)) AND 
     yai.Pro_Type = @Value AND yat.Type = 'PC' 

    SELECT @Count = @Count + 1 
    SELECT @Date = DATEADD(MONTH, 1, @Date) 
    SELECT @EndDate = DATEADD(MONTH, 1, @EndDate) 

END 
+0

Quel est le type de yat.date_received? –

+0

Ignorer le Convert avec le type 101, c'était juste quelque chose que j'ai essayé juste avant de poster ce code. Ce sont des champs datetime, et j'essaie de comparer à une valeur de date et d'heure – Jhorra

Répondre

0

Du haut de ma tête.

SELECT DATEPART(month, yat.Date) as month, COUNT(yai.ID) 
FROM table_1 yai 
INNER JOIN table_2 yat ON yai.ID = yat.ID 
WHERE 
    yai.Pro_Type = @Value AND yat.Type = 'PC' 
    AND DATEPART(year, yat.Date)[email protected] 
GROUP BY DATEPART(month, yat.Date) 
ORDER BY DATEPART(month, yat.Date) 
+0

Bien sûr, vous auriez besoin de sum() le compte après cela ... –

+0

Cela fonctionne sauf que j'ai besoin de faire une année fiscale qui commence en Juillet. – Jhorra

+0

Ceci est assez proche de ce dont j'ai besoin que je puisse le modifier pour le faire fonctionner. – Jhorra

1

BETWEEN est inclus, de sorte que votre 1 seconde Soustraire devrait être là (ou même un jour). Je suppose que certains yais n'ont pas de yat correspondant.

Modifier: Votre code est bidon. Vous ne pouvez pas faire de comparaison autre que l'égalité avec le format 101.

+0

+1 pour ne pas pouvoir faire de comparaison avec le format 101, excepté l'égalité. –

+0

Désolé, je n'ai pas eu la conversion 101 à l'origine, c'était juste quelque chose que j'ai essayé. Je dois avoir copié ce code au lieu de l'actuel avec la date complète – Jhorra

0

je disais des choses drôles comme je sais pertinemment il y a 50 articles et sql retourné 60 ...

J'ai trouvé que j'étais toujours tort! :)

Essayez le temps de décapage des champs date et heure:

DATEADD (d, DATEDIFF (d, 0, GetDate()), 0)

+0

Je connais le numéro parce que j'ai fait un compte. J'ai aussi d'autres requêtes de rapport qui le décomposent d'autres façons. Tous mes numéros correspondent, sauf quand je le divise par mois. – Jhorra

0

ne pourriez-vous faire à la place? La requête suivante vous donnera des comptes groupés par mois. Si vous mettez cela dans une vue, vous pouvez sélectionner à partir de la vue et d'utiliser une clause where pour filtrer l'année et le mois qui vous intéresse.

select year(yat.Date_Received) as year, month(yat.Date_Received) as month, count(*) as count 
    count(yai.ID) 
from table_1 yai 
inner join table_2 yat on yai.ID = yat.ID 
where yai.Pro_Type = 'some_value' 
    and yat.Type = 'PC' 
group by year(yat.Date_Received), month(yat.Date_Received) 
0

c'est un cas classique d'une boucle inutile est SQL code, mais si vous voulez résoudre cela avec une boucle, changer votre sélection dans la boucle de:

SELECT 
     COUNT(yai.ID) 

à:

SELECT 
    @Date,@EndDate,* 

puis regardez à la sortie et vérifier les lignes renvoyées

0

Pourquoi ne pas convertir les mois civils dans des références entières absolues comme ceci:

DECLARE @BeginDate datetime = '7/1/2008' 
DECLARE @EndDate datetime = '6/30/2009' 
-- 
-- Convert calendar months into an absoulte integer: 
-- 
DECLARE @BeginMonth int = (DatePart(year, @BeginDate) * 12) + DatePart(month, @BeginDate) 
DECLARE @EndMonth int = (DatePart(year, @EndDate) * 12) + DatePart(month, @EndDate) 

SELECT COUNT(yai.ID) 
FROM table_1 yai 
INNER JOIN table_2 yat ON yai.ID = yat.ID 
WHERE (DatePart(year, yat.Date_Received) * 12) + DatePart(month, yat.Date_Received) 
    BETWEEN @BeginMonth AND @EndMonth) 
AND yai.Pro_Type = @Value 
AND yat.Type = 'PC' 
0

Je trouve cette question parce que j'ai eu des problèmes avec l'utilisation de la date de chaîne dans les requêtes en utilisant Entre et j'utilisais métadonnées, mon collègue m'a aidé, donc j'espère que cela vous aide aussi:

N'convert(date,[fld_myDate]) Between convert(date,''01/01/2016'') AND convert(date,''08/26/2017'') ' 
Questions connexes