Ich möchte in der Lage sein, einer gespeicherten Prozedur einen Monat und ein Jahr zuzuweisen und alles zurückzugeben, was in diesem Monat passiert. Wie mache ich das, da ich nicht vergleichen kann, da einige Monate eine unterschiedliche Anzahl von Tagen usw. haben?
Was ist der beste Weg, dies zu tun? Kann ich nur nach Vergleichen nach Jahr und Monat fragen?
Vielen Dank.
sql
sql-server-2008
Tarks
quelle
quelle
Die Verwendung der in den meisten Antworten vorgeschlagenen Funktionen MONTH und YEAR hat den Nachteil, dass SQL Server keinen Index für Ihre Datumsspalte verwenden kann. Dies kann die Leistung auf einem großen Tisch beeinträchtigen.
Ich würde gerne einen DATETIME-Wert (z. B. @StartDate) an die gespeicherte Prozedur übergeben, die den ersten Tag des Monats darstellt, an dem Sie interessiert sind.
Sie können dann verwenden
SELECT ... FROM ... WHERE DateColumn >= @StartDate AND DateColumn < DATEADD(month, 1, @StartDate)
Wenn Sie den Monat und das Jahr als separate Parameter an die gespeicherte Prozedur übergeben müssen, können Sie mit CAST und CONVERT eine DATETIME generieren, die den ersten Tag des Monats darstellt. Gehen Sie dann wie oben vor. Wenn Sie dies tun, würde ich empfehlen, eine Funktion zu schreiben, die eine DATETIME aus ganzzahligen Werten für Jahr, Monat und Tag generiert, z. B. die folgenden aus einem SQL Server-Blog .
create function Date(@Year int, @Month int, @Day int) returns datetime as begin return dateadd(month,((@Year-1900)*12)+@Month-1,@Day-1) end go
Die Abfrage lautet dann:
SELECT ... FROM ... WHERE DateColumn >= Date(@Year,@Month,1) AND DateColumn < DATEADD(month, 1, Date(@Year,@Month,1))
quelle
@EndDate
wird dies durch die Deklaration deutlich.Als Alternative zu den Funktionen MONTH und YEAR funktioniert auch eine reguläre WHERE-Klausel:
select * from yourtable where '2009-01-01' <= datecolumn and datecolumn < '2009-02-01'
quelle
Mehr ein Tipp sehr einfach. Sie können auch die Funktion to_char verwenden.
Für Monat:
Für Jahr:
Für Tag:
Die Funktion to_char wird von der SQL-Sprache und nicht von einer bestimmten Datenbank unterstützt.
Ich hoffe, jemand mehr helfen ...
Abs!
quelle
Wenn Sie SQL Server verwenden, schauen Sie in DATEPART.
http://msdn.microsoft.com/en-us/library/ms174420(SQL.90).aspx
DATEPART (mm, [DAS DATUM, DAS SIE ANSEHEN])
Sie können dann die normale Ganzzahllogik verwenden. Das gleiche gilt für das Jahr. Verwenden Sie einfach yy anstelle von mm.
quelle
Sie können. Hier ist ein einfaches Beispiel mit der AdventureWorks-Beispieldatenbank ...
DECLARE @Year INT DECLARE @Month INT SET @Year = 2002 SET @Month = 6 SELECT [pch].* FROM [Production].[ProductCostHistory] pch WHERE YEAR([pch].[ModifiedDate]) = @Year AND MONTH([pch].[ModifiedDate]) = @Month
quelle
Ich finde es einfacher, einen Wert als zeitlichen Datentyp (z. B.
DATETIME
) zu übergeben und dann die zeitliche Funktionalität zu verwenden, insbesondereDATEADD
undDATEPART
, um das Start- und Enddatum für den Zeitraum zu finden, in diesem Fall den Monat, z. B. das Paar aus Startdatum und Enddatum ErsetzenCURRENT_TIMESTAMP
Sie für den aktuellen Monat einfachDATETIME
Ihren Parameter vom Typ (beachten Sie, dass der Wert für 1990-01-01 völlig willkürlich ist):SELECT DATEADD(M, DATEDIFF(M, '1990-01-01T00:00:00.000', CURRENT_TIMESTAMP), '1990-01-01T00:00:00.000'), DATEADD(M, DATEDIFF(M, '1990-01-01T00:00:00.000', CURRENT_TIMESTAMP), '1990-01-31T23:59:59.997')
quelle
So etwas sollte es tun:
select * from yourtable where datepart(month,field) = @month and datepart(year,field) = @year
Alternativ können Sie Monat und Jahr beim Erstellen des Datensatzes in eigene Spalten aufteilen und dann gegen diese auswählen.
Iain
quelle
Eine Möglichkeit wäre, eine Variable zu erstellen, die den ersten des Monats darstellt (dh den 01.05.2009), sie entweder an den Prozess zu übergeben oder zu erstellen (Monat / 1 / Jahr verketten). Verwenden Sie dann die DateDiff-Funktion.
Dies gibt alles mit einem passenden Monat und Jahr zurück.
quelle
SELECT * FROM yourtable WHERE yourtimestampfield LIKE 'AAAA-MM%';
Wo
AAAA
ist das Jahr, das Sie wollen und woMM
ist der Monat, den Sie wollenquelle