2009-05-27 6 views
1

Ex:Comment puis-je sélectionner/trier les dates par intervalles de période?

Si nous avons dans les dossiers de table comme:

25/06/2009 
28/12/2009 
19/02/2010 
16/04/2011 
20/05/2012 

Je veux diviser/sélectionner cette date selon des intervalles de 6 mois à compter de la date actuelle. résultat devrait être comme: 0-6 mois à partir de maintenant: premier enregistrement 7-12 mois à partir de maintenant: deuxième record ...

Ce sera beaucoup aprécié si vous faites ce simple comme je l'ai fait très stupide et compliqué comme:

declare variable like t1=curdate()+6 
t2=curdate()+12 

...

alors les enregistrements sélectionnés pour s'adapter entre curdate() et t1, puis t1 et t2, etc.

Merci,

r.

Répondre

1

CORRECTION: Si elle avait en arrière, besoin d'utiliser la division Modulus, entier non - désolé ...

Si MonthCount est une valeur calculée qui compte le nombre de mois depuis un particulier le 31 décembre, et mod est la division module (sortie le reste de la division)

Select [Column list here] 
From Table 
Group By Case When MonthCount Mod 12 < 6 
     Then 0 Else 1 End 

dans SQL Server, par exemple, vous pouvez utiliser la fonction DateDiff

Select [Column list here] 
From Table 
Group By Case When DateDiff(month, myDateColumn, curdate) % 12 < 6 
     Then 0 Else 1 End 

(dans SQL Server PERC signe ent est l'opérateur de module)

Ce groupera tous les record dans des seaux contenant chacun six mois de données

+0

Je pense que le point est qu'il ne veut pas l'exécuter à partir specifc Jan- > Périodes de juin et juillet-décembre, mais les périodes de 6 mois sont calculées à la volée à partir de la date actuelle. ainsi, à compter de la date d'aujourd'hui, la période précédente et suivante serait 2008-11-27 => 2009-05-27 ET 2009-05-27 => 2009-11-27 –

0
SELECT (DATEDIFF(MONTH, thedate, GETDATE())/6) AS semester, 
     SUM(receipt) 
FROM thetable 
GROUP BY semester 
ORDER BY semester 

l'idée clé est le regroupement et la commande par l'expression qui vous donne le « semestre » .

0

Cette question m'a vraiment déconcerté, parce que je ne pouvais pas vraiment trouver une solution simple pour cela. Zut.

Le mieux que j'ai pu gérer était une bastardisation absolue de ce qui suit: créer une table temporaire, y insérer les "périodes", revenir à la table d'origine et la grouper.

Supposons que votre table de contenu les éléments suivants sont

ID int 
Date DateTime 
Counter int 

Et vous essayez de résumer tous les counter « s en six périodes de mois

DECLARE @min_date datetime 
select @min_date = min(date) from test 

DECLARE @max_date datetime 
select @max_date = max(date) from test 


DECLARE @today_a datetime 
DECLARE @today_b datetime 
set @today_a = getdate() 
set @today_b = getdate() 

CREATE TABLE #temp (startdate DateTime, enddate DateTime) 

WHILE @today_a > @min_date 
BEGIN 
    INSERT INTO #temp (startDate, endDate) VALUES (dateadd(month, -6, @today_a), @today_a) 
    SET @today_a = dateadd(month, -6, @today_a) 
END 
WHILE @today_b < @max_date 
BEGIN 
    INSERT INTO #temp (startDate, endDate) VALUES (@today_b, dateadd(month, 6, @today_b)) 
    SET @today_b = dateadd(month, 6, @today_b) 
END 

SELECT * FROM #temp 

SELECT 
    sum(counter), 
    'Between ' + Convert(nvarchar(10), startdate, 121) + ' => ' + Convert(nvarchar(10), enddate, 121) as Period 
FROM test t 
    JOIN #Temp ht 
     ON t.Date between ht.startDate AND ht.EndDate 
GROUP BY 
    'Between ' + Convert(nvarchar(10), startdate, 121) + ' => ' + Convert(nvarchar(10), enddate, 121) 

DROP TABLE #temp 

J'espère vraiment que quelqu'un peut trouver une meilleure solution mon cerveau a évidemment fondu.

0

Pas tout à fait ce que vous essayez d'accomplir, mais vous pouvez utiliser la fonction DATEDIFF pour distinguer le allant de chaque enregistrement:

SELECT t.MonthGroup, SUM(t.Counter) AS TotalCount 
FROM ( 
     SELECT Counter, (DATEDIFF(m, GETDATE(), Date)/6) AS MonthGroup 
     FROM Table 
    ) t 
GROUP BY t.MonthGroup 

Cela créerait une sous requête avec une expression qui exprime la date allant groupe que vous voulez. Il regroupe ensuite la sous-requête par groupe de dates et vous pouvez alors faire ce que vous voulez avec les résultats.

Modifier: J'ai modifié l'exemple en fonction de votre exemple.

0

Si vous utilisez SQL Server:

SELECT *, 
    (
     FLOOR 
     (
      (
       DATEDIFF(month, GETDATE(), date_column) 
       - CASE WHEN DAY(GETDATE()) > DAY(date_column) THEN 1 ELSE 0 END 
      )/6.0 
     ) * 6 
    ) AS SixMonthlyInterval 
FROM your_table 

Si vous utilisez MySQL:

SELECT *, 
    (
     FLOOR 
     (
      (
       ((YEAR(date_column) - YEAR(CURDATE())) * 12) 
       + MONTH(date_column) - MONTH(CURDATE()) 
       - CASE WHEN DAY(CURDATE()) > DAY(date_column) THEN 1 ELSE 0 END 
      )/6.0 
     ) * 6 
    ) AS SixMonthlyInterval 
FROM your_table 
Questions connexes