webentwicklung-frage-antwort-db.com.de

SQL Server datetime LIKE auswählen?

in MySQL

select * from record where register_date like '2009-10-10%'

Was ist die Syntax in SQL Server?

85
Paisal

Sie können die Funktion DATEPART () verwenden

SELECT * FROM record 
WHERE  (DATEPART(yy, register_date) = 2009
AND    DATEPART(mm, register_date) = 10
AND    DATEPART(dd, register_date) = 10)

Ich finde diesen Weg einfach zu lesen, da er die Zeitkomponente ignoriert und Sie nicht das Datum des nächsten Tages verwenden müssen, um Ihre Auswahl einzuschränken. Sie können die Granularität erhöhen oder verringern, indem Sie zusätzliche Klauseln hinzufügen, indem Sie den entsprechenden DatePart-Code verwenden, z.

AND    DATEPART(hh, register_date) = 12)

um Aufzeichnungen zwischen 12 und 1 zu erhalten.

Die vollständige Liste der gültigen Argumente finden Sie in den MSDN DATEPART-Dokumenten .

128
Ralph Lavelle

Es gibt keine direkte Unterstützung für den LIKE-Operator für DATETIME-Variablen, aber Sie können DATETIME immer in VARCHAR umwandeln:

SELECT (list of fields) FROM YourTable
WHERE CONVERT(VARCHAR(25), register_date, 126) LIKE '2009-10-10%'

Überprüfen Sie die MSDN-Dokumente für eine vollständige Liste der verfügbaren "Stile" in der CONVERT-Funktion.

Marc

54
marc_s

Wenn Sie das tun, zwingen Sie es, eine Zeichenfolge-Konvertierung durchzuführen. Es ist besser, einen Start-/Enddatumbereich zu erstellen und Folgendes zu verwenden:

_declare @start datetime, @end datetime
select @start = '2009-10-10', @end = '2009-11-10'
select * from record where register_date >= @start
           and register_date < @end
_

Auf diese Weise kann der Index (falls vorhanden in _register_date_) anstelle eines Tabellenscans verwendet werden.

10
Marc Gravell

Sie können CONVERT verwenden, um das Datum in Textform abzurufen. Wenn Sie es in ein varchar (10) konvertieren, können Sie = anstelle von wie folgt verwenden:

select *
from record
where CONVERT(VARCHAR(10),register_date,120) = '2009-10-10'

Oder Sie können ein Datum für die obere und untere Grenze verwenden, mit dem zusätzlichen Vorteil, dass ein Index verwendet werden kann:

select *
from record
where '2009-10-10' <= register_date
and register_date < '2009-10-11'
7
Andomar

Leider ist es nicht möglich, datetime mit 'LIKE' in Richtung varchar zu vergleichen, aber die gewünschte Ausgabe ist auf andere Weise möglich.

    select * from record where datediff(dd,[record].[register_date],'2009-10-10')=0
7
Dani Mathew

Sie können auch convert verwenden, um das Datum mit LIKE durchsuchbar zu machen. Beispielsweise,

select convert(VARCHAR(40),create_date,121) , * from sys.objects where     convert(VARCHAR(40),create_date,121) LIKE '%17:34%'
3
Steve M

Der Operator LIKE funktioniert nicht mit Datumsteilen wie Monat oder Datum, der Operator DATEPART jedoch.

Befehl zum Herausfinden aller Konten, deren Eröffnungsdatum am 1. war:

SELECT * 
  FROM Account 
 WHERE DATEPART(DAY, CAST(OpenDt AS DATE)) = 1`

* CASTING OpenDt, weil sein Wert in DATETIME und nicht nur in DATE steht.

2
Mohit Sarin

Ich bin ein wenig zu spät zu diesem Thread, aber in der Tat gibt es direkte Unterstützung für den gleichen Operator in MS SQL Server.

Wie in der LIKE-Hilfe dokumentiert, wird versucht, einen Datentyp, der keine Zeichenfolge ist, in eine Zeichenfolge zu konvertieren. Und wie in der cast\convert-Dokumentation dokumentiert:

die Standardkonvertierung von Datum und Uhrzeit in eine Zeichenfolge ist vom Typ 0 (, 100). Dies ist mon dd yyyy hh: miAM (oder PM).

Wenn Sie ein Datum wie dieses in der DB haben:

2015-06-01 11:52:59.057

und du machst Fragen wie diese:

select * from wws_invoice where invdate like 'Jun%'
select * from wws_invoice where invdate like 'Jun 1%'
select * from wws_invoice where invdate like 'Jun 1 %'
select * from wws_invoice where invdate like 'Jun 1 2015:%'
select * from wws_invoice where invdate like 'Jun ? 2015%'
...
select * from wws_invoice where invdate like 'Jun 1 2015 11:52AM'

du bekommst diese Reihe.

Dieses Datumsformat deutet jedoch darauf hin, dass es sich um ein Datum handelt DateTime2, dann heißt es in der Dokumentation:

21 oder 121 - ODBC kanonisch (mit Millisekunden) Standardeinstellung für Zeit, Datum, DatumZeit2 und DatumZeitversatz. - JJJJ-MM-TT hh: mi: ss.mmm (24h)

Das macht es einfacher und Sie können Folgendes verwenden:

select * from wws_invoice where invdate like '2015-06-01%'

und erhalten Sie den Rechnungsdatensatz. Hier ist ein Demo-Code:

DECLARE @myDates TABLE (myDate DATETIME2);
INSERT INTO @myDates (myDate)
VALUES
('2015-06-01 11:52:59.057'),
('2015-06-01 11:52:59.054'),
('2015-06-01 13:52:59.057'),
('2015-06-01 14:52:59.057');

SELECT * FROM @myDates WHERE myDate LIKE '2015-06-01%';
SELECT * FROM @myDates WHERE myDate LIKE '2015-06-01 11%';
SELECT * FROM @myDates WHERE myDate LIKE '2015-06-01 11:52:59%';
SELECT * FROM @myDates WHERE myDate LIKE '2015-06-01 11:52:59.054%';

Die Suche nach Datum und Uhrzeit in SQL Server ohne Konvertierung in eine Zeichenfolge war immer problematisch. Das Erhalten jedes Datumsteils ist ein Overkill (der wahrscheinlich keinen Index verwenden würde). Wenn Sie die Zeichenfolgenkonvertierung nicht verwenden, ist die Verwendung von Bereichsprüfungen wahrscheinlich die bessere Möglichkeit. dh:

select * from record 
where register_date >= '20091010' and register_date < '20091011';
1
Cetin Basoz

Der LIKE-Operator deckt Daten in SQL Server nur sehr lückenhaft ab. Es funktioniert nur im amerikanischen Datumsformat. Als Beispiel könnten Sie versuchen:

... WHERE register_date LIKE 'oct 10 2009%'

Ich habe dies in SQL Server 2005 getestet und es funktioniert, aber Sie müssen wirklich verschiedene Kombinationen ausprobieren. Merkwürdige Dinge, die mir aufgefallen sind:

  • Sie scheinen nur alles oder nichts für verschiedene Unterfelder innerhalb des Datums zu erhalten. Wenn Sie beispielsweise nach "Apr 2%" suchen, erhalten Sie nur alles in den Zwanzigerjahren - es werden die Zweiten ausgelassen.

  • Die Verwendung eines einzelnen Unterstrichs '_' zur Darstellung eines einzelnen Zeichens (Platzhalter) funktioniert nicht vollständig, z. B. WHERE mydate LIKE 'oct _ 2010%' wird nicht alle Daten vor dem 10. zurückgeben - es gibt überhaupt nichts zurück, in der Tat!

  • Das Format ist starr amerikanisch: 'mmm dd yyyy hh:mm '

Ich habe es schwierig gefunden, einen Prozess für LIKEing Sekunden festzunageln, also wenn jemand dies ein bisschen weiterführen möchte, sei mein Gast!

Hoffe das hilft.

1
Paul

Ich habe mein Problem so gelöst. Vielen Dank für Verbesserungsvorschläge. Beispiel in C #.

string dd, mm, aa, trc, data;
dd = nData.Text.Substring(0, 2);
mm = nData.Text.Substring(3, 2);
aa = nData.Text.Substring(6, 4);
trc = "-";
data = aa + trc + mm + trc + dd;

"Select * From bdPedidos Where Data Like '%" + data + "%'";
0