SQL Server 2008 wählen Sie die Daten nur zwischen Monat und Jahr
Möchte ich wählen Sie Daten zwischen zwei Datum, ohne Tag
Einen Eingabe-Beispiel:
start-Monat: 9 , Anfang Jahr: 2011
Ende Monat: 3, Ende Jahr: 2012
Ich denke, es gibt zwei Wege, dies zu tun.
Die erste ist, konvertieren start-Monat und start-Jahr-bis-Datum wie 2011-09-01
konvertieren und letzten Tag der 2012-03-31
, aber dieses erfordert die Berechnung des letzten Tages der Ende Monat. Diese erhaltene Datum können wir eine Funktion zwischen den einzelnen, für die WHERE-Klausel (aber, ist die CONVERT-Funktion zuverlässig?)
Die zweite Lösung ist die Verwendung der DATEPART
Funktion wie im folgenden code:
Ich versuche zu erklären: wenn Ende Jahr gleich dem ersten Jahr, dann der Monat muss zwischen den start-und end-Monate; else if den letzten Monaten größer ist als in den ersten Jahren, wenn andere von der ersten und letzten Jahr, ich nehme alles dazwischen; sonst, wenn das Letzte Jahr, der Monat muss kleiner als oder gleich den letzten Monat, wenn das erste Jahr, Monat muss größer als oder gleich den letzten Monat
Können Sie mir helfen, tun Sie dies in der beste Weg? Korrekt ist, die Lösung, die ich angenommen?
declare @IndDebitoCredito bit,@ProgTributo int,@mi as integer,@ai as integer,@mf as integer,@af as integer,@IDAnagrafica varchar(5)
select @mi = 01,@ai = 2011,@mf = 12,@af = 2011,@IDAnagrafica = 'DELEL',@IndDebitoCredito = 1
select distinct rrd.IDTributo
from TBWH_Delega d
--inner join TBWH_SezioneDelega sd on d.IDDelega = sd.IDDelega
inner join TBWH_Rigo rd on rd.IDDelega = d.IDDelega
inner join TBWH_RataRigo rrd on rrd.IDRigo = rd.IDRigo
where
(
DATEPART(MM,d.DataDelega)<=@mf and
DATEPART(MM,d.DataDelega)>=@mi and
DATEPART(YYYY,d.DataDelega)=@ai and
@af = @ai
)
OR
(
--anno finale magg. anno iniziale
@af > @ai AND
(
( -- delega nell'intervallo
DATEPART(YYYY,d.DataDelega)<@af AND
DATEPART(YYYY,d.DataDelega)>@ai
-- DATEPART(MM,d.DataDelega)>=@mi
)
OR
( -- delega limite destro
DATEPART(YYYY,d.DataDelega)=@af AND
DATEPART(MM,d.DataDelega)<=@mf
)
OR
( -- delega limite sinistro
DATEPART(YYYY,d.DataDelega)=@ai AND
DATEPART(MM,d.DataDelega)>=@mi
)
)
)
GEHEN
- Ich dachte zuerst, das endgültige " GO " war für uns: "Hier ist die Frage. Nun.. GEHEN!" 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre erste Lösung ist fast da, aber ist komplizierter als es sein muss und nicht irgendwie funktionieren. Es verpassen alle Zeilen aus der letzten Tag Ende Monat.
Können Sie einen Monat, um die
end month
und verwenden Sie dann ZWISCHEN auf den ersten eines jeden Monats. zB.start month: 9 , start year: 2011
end month: 3, end year: 2012
BETWEEN '2011-09-01' AND '2012-04-01'
oder, wie JNK-Punkte aus, wird dies besser:
DataDelega >= '2011-09-01' AND DataDelega < '2012-04-01'
Müssen Sie in einer bestimmten Logik befassen sich mit der
end month
Dezember, aber das sieht aus wie die einfachste Weg, es zu tun.BETWEEN
ist inklusive also4/1/2012
.'2012-04-01 00:00:000'
. Ohne zu sehen, die Daten in Frage, ich weiß nicht, ob das ein problem ist oder nicht.Sind Sie WEG overcomplicating diese. Sie brauchen wirklich nur zwei Vergleiche:
Versuchen:
YYYYMMDD
da das getrennte beliebige Sprache/regionale Einstellungen im SQL - Server-auf meinem server, ein10/1/2011
würde interpretiert als 10. Januar 2011, zum Beispiel.....DateField
ist ein Datum und kein Datetime. Oder wenn der zeitteil ist immer auf Mitternacht eingestellt.Vermeiden Sie die Verwendung von Ausdrücken, die auf die DateField-Spalten, da es macht die Abfrage nicht SARGable.
Würde ich verwenden: