2016-07-14 7 views
0

enter image description here Ich erstelle eine Abfrage von zwei Werten, einer Periodennummer und dem entsprechenden Datum. Die Perioden sind Abrechnungszeiträume, die ähnlich, aber nicht identisch mit unseren Monaten sind. Die Daten sind weitgehend korrekt, aber es gibt ein paar Unstimmigkeiten, die ich dachte, ich würde mit einer WHERE-Anweisung bereinigen.SQL-Server Datetime in WHERE-Klausel Ausgabe

Zum Beispiel gehört das Datum 2015.04.01 in der Periode 3, aber es zeigt sowohl in der Periode 3 und Zeitraum bis 4. Um dies zu beheben, dachte ich, dass ich eine erstellen WHERE-Anweisung besagen:

SELECT DISTINCT table1.period, 
       table1.datetime 
FROM table1 
WHERE table1.period <> 4 AND table1.datetime <> '4/1/2015' 

Dies dauerte alle Zeit 4 weg statt nur die, die ich brauchte. Ich habe auch die Datetime-Syntax versucht:

AND table1.datetime <> '20150401 00:00:00.000' 

Beide Syntaxen die gleichen Ergebnisse hatten. Ich bin bei SQL ziemlich unerfahren und hasse es immer, mit Datetime-Werten umzugehen, also wäre jede Hilfe großartig.

-EDIT- Vergessen, einzelne Zitate zur ersten datetime WHERE-Klausel hinzuzufügen.

+0

Welches ist der Typ von table1.datetime? –

+0

@alex es ist ein Datetime-Datentyp, und Punkt ist eine Zeichenfolge. – GHINOTE

+1

Hat es einen Zeitwert für das Datum? Möglicherweise müssen Sie beim Vergleich mit einer Datumszeichenfolge als Datum umwandeln. Wie in '4/1/2015 01: 00: 00.000' nicht gleich '4/1/2015', aber CAST ('4/1/2015 01: 00: 00.000' AS DATE). – BinaryPatrick

Antwort

1

Versuchen Sie folgendes:

SELECT DISTINCT table1.period, 
      table1.datetime 
FROM table1 
WHERE CASE WHEN table1.period = 4 AND CONVERT(VARCHAR(8),table1.datetime,112) = '20150401' THEN 1 ELSE 0 END = 0 

Dies ist nur der Zeilen loszuwerden, die sowohl period=4 und datetime=20150401 hat, während die Abfrage zunächst etwas loszuwerden, die period=4 hat (egal was [datetime] ist), dann loswerden von allem hat datetime=20150401.

+0

Case-Anweisungen ändern nur die Ausgabe, wenn Sie ein OR verwenden. Anweisungen, die UND-Bedingungen werden gleich bewertet. Sie beide mit einer AND-Anweisung zu haben, bedeutet, dass beide wahr sein müssen, um in der Menge zu bleiben. – BinaryPatrick

+0

Das funktioniert. Entschuldigung, aber ich kann noch nicht upvote. – GHINOTE

0

Haben Sie gesagt, dass die Periode ein Stringfeld ist? Du meinst ein Varchar?
Sie möchten auch nur den Datumsteil überprüfen, nicht die Zeit?

dann können Sie versuchen, diese

SELECT DISTINCT table1.period, 
       table1.datetime 
FROM table1 
WHERE table1.period <> '4' 
AND convert(date, table1.datetime) <> '20150401' 
+0

Dies funktioniert, um die Periode 4 (4/1/2015) loszuwerden, während alle anderen Daten der Periode 4 beibehalten werden, aber auch die Periode 3 (4/1/2015), die das korrekte Datum ist, loszuwerden. – GHINOTE

+0

OK es war nicht sehr klar für mich, was Sie wollten – GuidoG