MySQL'de
select * from record where register_date like '2009-10-10%'
SQL Server'daki sözdizimi nedir?
MySQL'de
select * from record where register_date like '2009-10-10%'
SQL Server'daki sözdizimi nedir?
DATETIME
değerlere dizeler gibi davranmanın neden kötü olduğu ve BETWEEN
veya kullanımının neden kötü olabileceği dahil >= AND <=
), Aaron Bertrand'ın bu bloguna bakın .
5
için en az oy var . Eşanlamlı olarak sql-like önermenizi rica edebilir miyim ?
Yanıtlar:
DATEPART () işlevini kullanabilirsiniz
SELECT * FROM record
WHERE (DATEPART(yy, register_date) = 2009
AND DATEPART(mm, register_date) = 10
AND DATEPART(dd, register_date) = 10)
Zaman bileşenini görmezden geldiğinden ve seçiminizi kısıtlamak için sonraki günün tarihini kullanmak zorunda olmadığından bu yolu okumayı kolay buluyorum. Uygun DatePart kodunu kullanarak fazladan cümle ekleyerek daha büyük veya daha az ayrıntı düzeyine gidebilirsiniz, örn.
AND DATEPART(hh, register_date) = 12)
12 ile 1 arasında yapılan kayıtları almak için.
Consult MSDN DATEPART docs geçerli argümanlar tam listesi için.
DATETIME değişkenlerine karşı LIKE operatörü için doğrudan destek yoktur, ancak DATETIME değerini her zaman bir VARCHAR'a çevirebilirsiniz:
SELECT (list of fields) FROM YourTable
WHERE CONVERT(VARCHAR(25), register_date, 126) LIKE '2009-10-10%'
Kontrol MSDN dokümanlar CONVERT işlevinin mevcut "stilleri" tam listesi için.
Marc
WHERE CONVERT(VARCHAR(25), register_date, 25) LIKE '2009-10-10%'
Bunu yaparsanız, onu bir dize dönüşümü yapmaya zorluyorsunuz. Bir başlangıç / bitiş tarihi aralığı oluşturmak ve kullanmak daha iyi olur:
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
Bu, register_date
bir tablo taraması yerine dizini (eğer varsa) kullanmasına izin verecektir .
Tarihi metin biçiminde almak için CONVERT'i kullanabilirsiniz. Bunu bir varchar (10) 'a dönüştürürseniz, bunun yerine = kullanabilirsiniz:
select *
from record
where CONVERT(VARCHAR(10),register_date,120) = '2009-10-10'
Ya da bir üst ve alt sınır tarihi kullanabilirsiniz, bunun bir endeksi kullanma avantajı vardır:
select *
from record
where '2009-10-10' <= register_date
and register_date < '2009-10-11'
Ne yazık ki, tarih-saati varchar ile 'LIKE' kullanarak karşılaştırmak mümkün değildir. Ancak istenen çıktı başka bir şekilde mümkündür.
select * from record where datediff(dd,[record].[register_date],'2009-10-10')=0
LIKE
Operatör ay veya tarih gibi tarih parçalarla çalışmıyor ama DATEPART
operatör yok.
Açılış Tarihi 1. gün olan tüm hesapları bulma komutu:
SELECT *
FROM Account
WHERE DATEPART(DAY, CAST(OpenDt AS DATE)) = 1`
* DÖKÜM OpenDt
çünkü onun değeri içindedir DATETIME
ve sadece değil DATE
.
SQL Server'daki tarihler için LIKE işlecinin çok kesintili bir kapsamı vardır. Yalnızca Amerikan tarih biçimini kullanarak çalışır. Örnek olarak şunları deneyebilirsiniz:
... WHERE register_date LIKE 'oct 10 2009%'
Bunu SQL Server 2005'te test ettim ve işe yarıyor, ancak gerçekten farklı kombinasyonları denemeniz gerekecek. Fark ettiğim tuhaf şeyler:
Yalnızca tarih içinde farklı alt alanlar için tümü veya hiçbir şey almamış gibi görünüyorsunuz, örneğin, "% 2 nisan" ararsanız, yalnızca 20'li yıllarda herhangi bir şey elde edersiniz - 2.'leri atlar.
Tamamen iş, örneğin olmayan bir tek (joker) karakteri temsil etmek '_' Tek bir çizgi kullanarak WHERE mydate LIKE 'oct _ 2010%'
olacak değil tüm tarihleri iade önce aslında, hiç bir şey döndürür - 10!
Biçim katı Amerikan'dır: ' mmm dd yyyy hh:mm
'
Bir süreci GİBİ saniyeler içinde tamamlamakta zorlandım, bu yüzden bunu biraz daha ileri götürmek isteyen varsa, konuğum olun!
Bu yardımcı olur umarım.
Bu iş parçacığına biraz geç kaldım, ancak aslında MS SQL sunucusunda benzer operatör için doğrudan destek var.
LIKE yardımında belgelendiği gibi, veri türü bir dizge değilse, onu bir dizeye dönüştürmeye çalışılır. Ve cast \ convert belgelerinde belirtildiği gibi:
dizeye varsayılan tarih saat dönüşümü, mon gg yyyy hh: miAM (veya PM) olan 0 (, 100) türüdür.
DB'de böyle bir randevunuz varsa:
2015-06-01 11:52:59.057
ve bunun gibi sorgular yaparsınız:
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'
o sırayı al.
Bununla birlikte, bu tarih biçimi bunun bir DateTime2 olduğunu gösterir , ardından belgeler şunları söyler:
21 veya 121 - ODBC kanonik (milisaniye ile) saat, tarih, tarih saat2 ve tarih saat ofset için varsayılan. - yyyy-aa-gg ss: mi: ss.mmm (24s)
Bu işi kolaylaştırır ve şunları kullanabilirsiniz:
select * from wws_invoice where invdate like '2015-06-01%'
ve fatura kaydını alın. İşte bir demo kodu:
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%';
SQL sunucusunda dizeye herhangi bir dönüştürme yapmadan datetime aramaları yapmak her zaman sorunlu olmuştur. Her tarih bölümünü almak aşırı bir şeydir (muhtemelen bir indeks kullanır). Dize dönüştürme kullanmadığınızda muhtemelen daha iyi bir yol, aralık kontrollerini kullanmaktır. yani:
select * from record
where register_date >= '20091010' and register_date < '20091011';
Sorunumu bu şekilde çözdüm. İyileştirme önerileriniz için teşekkür ederiz. C # 'da örnek.
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 + "%'";