2016-07-03 15 views
-1

ich eine Rechnung Datumsspalte in meinem Tisch haben, die Daten enthält, wie untenmit Daten Verwenden von GROUP BY

20150131 
20150231 
20160128 
20161231 

ich zu einer Gruppe auf das Jahr der Transaktion die Daten wollen basiert ... also 2015 oder 2016. Mein Säulentyp ist nvarchar.

Kann jemand bitte helfen. Ich bin mit SQL Server 2012.

+1

Mögliches Duplikat [Wie kann ich tun \ 'Gruppe von \' teilweise Übereinstimmung] (http://stackoverflow.com/questions/5977506/how-do-i-do-group-by-partial- match) – CodeCaster

+0

Oder wenn sie tatsächlich Datum sind: [Wie man nach Jahr gruppiert] (http://stackoverflow.com/questions/5964094/how-to-group-by-year) – CodeCaster

+3

Lesen Sie Aaron Bertrands [schlechte Angewohnheiten zu treten : Wählen des falschen Datentyps] (http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/12/bad-habits-to-kick-using-the-wrong-data-type.aspx) –

Antwort

1

Unter der Annahme, dass die Spalte ganze Zahl ist, da Integer-Division in SQL Server das Ergebnis abschneidet, alles, was Sie tun müssen, ist die unteren vier Ziffern Teilung aus:

SELECT 
    datefield/10000 AS Year 
, SUM(...) AS ... 
FROM MyTable 
WHERE ... 
GROUP BY datefield/10000 

Wenn Ihr Spalte ist ein Char oder Varchar, verwenden Sie stattdessen LEFT(datefield,4).

Hinweis: Ich gehe davon aus, dass Sie nicht die Tabelle besitzen, so ist die Umstellung auf einen geeigneteren Typ (d. H. date) keine Option. Andernfalls würde ich einen Switch dringend empfehlen, weil date kleiner ist, und es gibt Ihnen auch Zugriff auf datumsspezifische Funktionen, wie das Extrahieren des Tages, des Monats und des Jahres.

+4

Das geht davon aus, dass der Datentyp integer ist ... wenn es ein char ist, sollte stattdessen 'LEFT (datefield, 4)' verwendet werden. –

+0

@ZoharPeled Ich bin mir fast sicher, dass es ganzzahlig ist, weil ich andere Leute gesehen habe, die es aus Bequemlichkeit machen, anstatt "date" zu benutzen. Es ist schwer vorstellbar, warum man eine String-Repräsentation für ein Datum auswählen sollte, weil es größer und langsamer ist. – dasblinkenlight

+2

Ich neige dazu, Ihrer Annahme zuzustimmen, aber ich habe meinen Anteil an Kodierungsschrecken gesehen. Ich habe gelernt, das Offensichtliche in diesen Dingen nicht anzunehmen. Im Zweifelsfall frage ich normalerweise beide Möglichkeiten. –

1

Wenn Ihre Reisedaten gültig sind, dann einfach können Sie verwenden:

SELECT ... FROM ... GROUP BY YEAR(CAST(myDate AS DATETIME)) 

Aber wenn Ihre Daten sind nicht gültig sind (wie jetzt, weil 28. Februar Tagen hat), können Sie dies versuchen:

SELECT ... FROM ... GROUP BY SUBSTRING(myDate,1,4) 

Oder

SELECT ... FROM ... GROUP BY Left(myDate,4) 
0

Sie Datepart-Funktion verwenden können;

select DATEPART(year,CONVERT(date,col,105)),COUNT(*) from table_1 
group by DATEPART(year,CONVERT(date,col,105))