2017-10-15 2 views
2

Je passe deux plage de dates à ma procédure puis je sélectionne la dernière date de chaque mois comme ci-dessousmultiples clause where date

create procedure stcheck 
@From_Date date, 
@To_Date date 
as 
begin 


declare @tmpTable table (dates date) 
declare @startDate date = @From_Date 
declare @endDate date = @To_Date 

while @startDate <= @endDate 

begin 
    insert into @tmpTable (dates) values (@startDate) 
    set @startDate = DATEADD(DAY, 1, @startDate) 
end 

select max(dates) as [Last day] from @tmpTable as o 
group by datepart(YEAR, dates), datepart(MONTH, dates) 

Si je suis obtenir résultat comme suit

Last day 
2017-01-31 

2017-02-28 

2017-03-31 

2017-04-30 

Je dois transmettre des données à table temporaire en utilisant ces sorties de date

Ex: -

Insert #xyz 

Select * from abcd where postdate <=’2017-01-31’ 

Et mon exigence est que ces toutes les dates devraient être automatiquement utilisées et les données pertinentes devraient passer à #table.


Bonjour expert. merci pour votre réponse rapide.

En bref, mon exigence est la suivante. S'il vous plaît aider parce que je suis nouveau avec sql.

Pensez, j'ai une table comme « stock » avec et hors transaction en actions et stock

rapport peut être considéré comme suit à tout comme à la date

SELECT item ,SUM(InQty-OutQty) FROM stock 
WHERE TransDate <= @AsatDate 
GROUP BY item 
Having SUM(InQty-OutQty) > 0 

Si je dois obtenir le chaque fin de mois lorsque je passe la plage de dates

de @From date = '2017/05/01' à @ AsatDate = '2017/09/30'.

Le résultat du rapport de stock devrait ressembler à ceci.

STOCK REPORT EXAMPLE

S'il vous plaît aider à ce qui peut être fait?

NB: - il devrait pouvoir passer n'importe quelle plage de dates quand cela est nécessaire.

+2

Juste quelques éléments 1) Je suspecte SQL Server ... quelle version? 2) Les fonctions de bouclage doivent être évitées. 3) Les données de la source de l'échantillon et les résultats souhaités seraient plus utiles. –

+0

Pouvez-vous clarifier la dernière partie? Comment cette requête d'insertion est-elle liée à la procédure stockée? – Parfait

+0

s'il vous plaît voir mon plus de clarification –

Répondre

0

Votre question est un peu floue, mais je suppose que vous voulez exécuter la procédure stockée et insérer des données dans la table temporaire #xyz (tableau suppose température #xyz existe déjà):

insert into #xyz 
exec stcheck @From_Date, @To_Date 

maintenant off sur une petite tangente:

Je voudrais également regarder table-valued functions si vous avez besoin d'une sortie tabulaire paramétrique et déterministe comme ceci. Je suis d'accord avec @John que vous devriez éviter de faire une boucle si possible. Une façon possible d'y parvenir est d'utiliser une table de calendrier pré-remplie au jour le jour (un bâton indique 50-100 années de dates de calendrier dans un tableau et l'utilise dans les calculs - il y a des tonnes d'exemples de faites ceci en ligne). Une autre méthode consiste à utiliser un CTE récursif ou un tableau de nombres, tous deux décrits dans les réponses here. Une fois que vos dates de calendrier sont facilement interrogeables, vous pouvez coller tout cela dans une vue ou une fonction de table en ligne et ce sera super rapide et beaucoup plus clair. Si vous utilisez régulièrement le "dernier jour du mois" comme critère de filtre, vous pouvez même le pré-calculer en tant que colonne dans votre tableau de calendrier.Voici ce qu'il pourrait finir comme:

insert into #xyz 
select dbo.DatesBetween(@From_Date, @To_Date) 

Vous pouvez même utiliser directement dbo.DatesBetween(@From_Date, @To_Date) dans votre requête à la place de la table temporaire, si elle est utilisée une seule fois.

+0

s'il vous plaît voir ma clarification plus –