2012-02-15 3 views
1

L'utilisateur clique sur un mois, puis cette procédure stockée est exécutée. Il vérifie le temps total réservé et les groupes filtrés.Filtre basé sur plusieurs plages de dates?

| Job Group | Month Booked | Time (hrs) | 
    Cleaning  Jan   7 

J'ai l'instruction SQL suivante:

SELECT 
    tsks.grouping_ref, ttg.description AS grouping_desc, 
    SUM(ts.booked_time) AS booked_time_total, 
    DATENAME(MONTH, ts.start_dtm) + ' ' + DATENAME(YEAR, ts.start_dtm) AS month_name, 
    @month_ref AS month_ref 
FROM 
    timesheets ts 
JOIN 
    timesheet_categories cat ON ts.timesheet_cat_ref = cat.timesheet_cat_ref 
JOIN 
    timesheet_tasks tsks ON ts.task_ref = tsks.task_ref 
JOIN 
    timesheet_task_groupings ttg ON tsks.grouping_ref = ttg.grouping_ref 
WHERE 
    ts.status IN(1, 2) --Booked and approved 
    AND cat.is_leave_category = 0 --Ignore leave 
    AND DATEPART(YEAR, ts.start_dtm) = @Year 
    AND DATEPART(MONTH, ts.start_dtm) = @Month 
GROUP BY 
    tsks.grouping_ref, ttg.description, 
    DATENAME(MONTH, ts.start_dtm), 
    DATENAME(YEAR, ts.start_dtm) 
ORDER BY 
    grouping_desc 

Je veux filtrer en fonction des plages de dates multiples.

Je pensais à ajouter ceci:

AND ((ts.start_dtm BETWEEN '2011-12-28' AND '2012-01-01') 
OR (ts.start_dtm BETWEEN '2012-01-02' AND '2012-01-29')) 

Mais alors réalisé que ce ne serait pas question ce mois, l'utilisateur a cliqué, il montrerait encore tous les registres qu'il procédera à la déclaration OU.

Ce que je besoin est quelque chose qui est basé sur le month_ref, par exemple:

CASE WHEN @month_ref = 81201 THEN 
AND (ts.start_dtm BETWEEN '2011-12-28' AND '2012-01-01') 
END 

Mais la déclaration de cas doit aller juste après la clause WHERE.

J'ai environ 12 mois comptables pour 2012 que j'ai besoin d'ajouter comme instructions de cas, de sorte que lorsque l'utilisateur cliquera sur Mars, il lancera le bon filtre.

Dans la base de données ts.start_dtm ressemble à ceci:

2011-04-01 00:00:00.000 

espoir qui était assez d'information pour mon premier poste?

Je suis coincé en train d'écrire la déclaration de cas et où, pour le dire, j'ai essayé pendant des heures maintenant.

Espoir vous pouvez aider :)

Répondre

0

Donnez la nature irrégulière de vos dates empêcheraient l'utilisation dateparts; Je construirais une table temporaire des dates permises basées sur la requête d'utilisateur et joindrais dessus. La table d'entiers statiques dans mon application a 1 à 64000 vos tables peuvent varier.

DECLARE 
    @startdate DateTime = '2012-05-01', 
    @EndDate DateTime = '2012-06-03' 

DECLARE 
    @AllDates TABLE (MyDate DateTime) 

INSERT INTO @AllDates 
SELECT 
    DATEADD(dd, StaticInteger, @startdate) 
FROM dbo.tblStaticIntegers 
WHERE StaticInteger <= DATEDIFF(dd, @startdate, @EndDate) 
+0

Merci pour cela, donc l'extrait de code crée la table temporaire dans mon DB ? –

+0

L'exemple utilise une table temporaire pour stocker les dates d'exécution de la requête par rapport à yes. Vous devrez créer une table permanente d'entiers pour que l'instruction insert fonctionne (en supposant que vous n'en ayez pas déjà un) – u07ch

+0

Ma procédure stockée semble fonctionner dans le studio de gestion mais le site ne semble pas aimer DATE ENTRE. Des idées pourquoi? –

0

Une option serait d'avoir une table de correspondance entre le numéro de référence du mois à un début et une date de fin ainsi récupérer ces valeurs et de les utiliser dans votre chèque de ts.start_dtm. ie il aurait:

Mois-réf | Démarrer | Fin
81201 | 2011-12-28 | 2012-01-01
81202 | 2012-01-02 | 2012-01-29

etc

Vous pouvez simplement joindre à cette table de référence ou bien récupérer les deux dates avant votre principale requête

Questions connexes