2017-05-10 6 views
0

Ich habe eine Tabelle namens theTable von wo ich einige Daten importieren möchten. theTable enthält Product stock Werte, und ich bin nur daran interessiert, die Aktienbestände am letzten Tag eines jeden Monats in einem Bereich von 6 Monaten zu finden.SQL Server: WHERE-Klausel, um nur Werte aus einem Bereich des letzten Tages von Monaten

Ich habe eine Spalte namens DateKey, die aussieht wie yyyymmdd und beschreibt das Datum, für das ein Bestandsbestand aufgezeichnet wird.

Als Beispiel würde Ich mag die stockValue an den DateKey Werte ableiten können: 20160131,20160331

Dafür habe ich versucht:

CREATE TABLE #theTable 
(
    DateKey INT, 
    stockValue INT 
); 

INSERT INTO #theTable 
VALUES (20160131, 4), (20160130, 5), 
     (20160312, 5), (20160331, 4); 

SELECT DateKey, stockValue 
FROM #theTable 
WHERE DateKey BETWEEN CONVERT(VARCHAR(8), DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) - 16, 0), 112) 
        AND CONVERT(VARCHAR(8), DATEADD(MONTH, DATEDIFF(MONTH, -1, GETDATE()) - 13, -1), 112) 

(wo ich das hinzugefügte konvertieren() Spielereien, um Fehler zu vermeiden DateKey nicht vom Typ seiner DateTime)

Aber das (natürlich) zurück:

012.351.
DateKey  stockValue 
20160131 4 
20160130 5 
20160312 5 
20160331 4 

wie kann ich diese SQL-Anweisung anpassen enthalten nur:

DateKey  stockValue 
20160131 4 
20160331 4 

heißt in den letzten Tagen des Monats über den Bereich meiner angegebenen Datum?

EDIT:

Die Frage ist, ob es einen Weg gibt nur den letzten Tag der Werte zu erhalten, ohne zu hart Code mit einer WHERE DateKey IN ('20160131', '20160228', '20160331') da es viele verschiedene Werte geben würde, aus denen ich wählen würde, die eine hart codierte Lösung machen würden, die sehr fehler- und zeitintensiv wird.

+2

Warum ist 'datekey' kein' date' Art in erster Linie? Da es scheint, dass Sie nur nach dem letzten Tag des Monats suchen, haben Sie die ['EOMONTH()'] (https://docs.microsoft.com/en-us/sql/t-sql/ Funktionen/eomonth-transact-sql) Funktion? – alroc

+0

Mögliches Duplikat von [SQL Query, um den letzten Tag des Monats zu finden] (http://stackoverflow.com/questions/16646585/sql-query-to-find-the-last-day-of-the-month) –

+0

Eine schnelle Google-Suche erzeugte Seiten mit Duplikaten. Haben Sie sich bemüht, das Problem selbst zu lösen? –

Antwort

2

Verwenden Sie EOMONTH Funktion und erhalten nur solche Zeilen.

SELECT DateKey, stockValue 
FROM #theTable 
where CONVERT(date, convert(varchar(10), datekey)) = eomonth(CONVERT(date, convert(varchar(10), datekey))) 
+0

Danke für die Antwort. Ich habe früher mit EOMONTH herumgespielt, aber ich denke, dass ich die Implementierung überbewertet habe, wo ich aus irgendeinem Grund Schwierigkeiten damit hatte, einen DateKey zu implementieren, der nicht vom Typ DateTime ist. Aber diese Lösung war wirklich anmutig. – Cenderze

1

Dies gibt Ihnen das Ende des aktuellen Monats:

FORMAT(EOMONTH(GETDATE()), 'yyyyMMdd') 

Und das gibt Ihnen das Ende des Monats vor 2 Monaten:

FORMAT(EOMONTH(DATEADD(MONTH, -2, GETDATE())), 'yyyyMMdd') 
0
SELECT DateKey, stockValue 
FROM #theTable 
WHERE DateKey = 
DATEADD(month, ((YEAR(DateKey) - 1900) * 12) + MONTH(DateKey), -1) 
0

you cant Garantie Unter der Annahme, dass der letzte Datumschlüssel der letzte Tag des Monats

ist

wird diese

create table #theTable(
DateKey int, 
stockValue int 
); 

insert into #theTable 
VALUES(20160131,4), 
(20160130,5), 
(20160312,5), 
(20160331,4); 

;with lastDayOfMonth as (
select 
max(DateKey) as MaxDate 
from #theTable 
group by left(cast(DateKey as varchar(8)),6)) 

SELECT DateKey, stockValue ,left(cast(DateKey as varchar(8)),6) 
FROM #theTable 
inner join lastDayOfMonth 
on MaxDate = DateKey 
WHERE DateKey between convert(varchar(8),DATEADD(month,datediff(month,0,getdate())-16,0),112) 
and CONVERT(VARCHAR(8),DATEADD(MONTH, DATEDIFF(month, -1, getdate())-13,-1),112) 

drop table #theTable 
0

arbeiten Sie können EOMONTH(), wie unten

select * from #thetable where 
convert(date,convert(varchar(8), DateKey,112)) = eomonth(convert(date, convert(varchar(8), datekey,112))) 

Ausgabe verwenden:

+----------+------------+ 
| DateKey | stockValue | 
+----------+------------+ 
| 20160131 |   4 | 
| 20160331 |   4 | 
+----------+------------+ 
0

Sie nutzen EOMONTH (https://docs.microsoft.com/en-us/sql/t-sql/functions/eomonth-transact-sql) könnte zu prüfen, ob das Datum der ist letztes Datum des Monats

Etwas wie folgt aus:

create table #theTable(
DateKey int, 
stockValue int 
); 

insert into #theTable 
VALUES(20160131,4), 
(20160130,5), 
(20160312,5), 
(20160331,4); 


SELECT DateKey, stockValue 
FROM #theTable 
WHERE DateKey between convert(varchar(8),DATEADD(month,datediff(month,0,getdate())-16,0),112) 
and CONVERT(VARCHAR(8),DATEADD(MONTH, DATEDIFF(month, -1, getdate())-13,-1),112) 
AND EOMONTH (CONVERT(varchar(8),datekey)) = CONVERT(varchar(8),datekey) 


DROP TABLE #theTable 
Verwandte Themen