SQL Server datetime SEPERTI pilih?


92

di MySQL

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

Apa sintaks di SQL Server?


Apa yang sebenarnya ingin Anda periksa? Bahwa waktu tertentu memiliki bagian tanggal tertentu? Atau sesuatu yang lain?
Chris J

1
Untuk diskusi yang sehat tentang ini (termasuk mengapa buruk memperlakukan DATETIMEnilai seperti string, dan mengapa itu bisa buruk untuk digunakan BETWEENatau >= AND <=), lihat blog ini oleh Aaron Bertrand .
Aaron Bertrand

Pertanyaan Anda setidaknya memiliki 5suara untuk tag operator-serupa . Bisakah saya dengan hormat meminta Anda menyarankan sql-like sebagai sinonim ?
Kermit

Jawaban:


138

Anda dapat menggunakan fungsi DATEPART ()

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

Saya merasa cara ini mudah dibaca, karena mengabaikan komponen waktu, dan Anda tidak perlu menggunakan tanggal hari berikutnya untuk membatasi pilihan Anda. Anda dapat pergi ke perincian yang lebih besar atau lebih kecil dengan menambahkan klausa ekstra, menggunakan kode DatePart yang sesuai, misalnya

AND    DATEPART(hh, register_date) = 12)

untuk mendapatkan rekaman yang dibuat antara 12 dan 1.

Lihat dokumen MSDN DATEPART untuk daftar lengkap argumen yang valid.


Jika ada indeks pada register_date, ini akan mengabaikan indeks sepenuhnya dan kinerja akan terganggu. Mungkin sangat buruk.
Chris J

Oke, tetapi ini menghindari masalah penggunaan string yang setara dengan hari setelah tanggal yang dipermasalahkan, yang disarankan dalam beberapa jawaban di sini. Rumit dimana tanggal yang dimaksud adalah akhir bulan atau tahun.
Ralph Lavelle

60

Tidak ada dukungan langsung untuk operator LIKE terhadap variabel DATETIME, tetapi Anda selalu dapat mentransmisikan DATETIME ke VARCHAR:

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

Periksa dokumen MSDN untuk daftar lengkap "gaya" yang tersedia di fungsi CONVERT.

Marc


1
setuju - tetapi OP meminta cara untuk menangani datetime dengan LIKE .... Tapi saya setuju - datetimes sebaiknya ditangani dengan rentang seperti> = dan <= atau ANTARA - pendekatan yang jauh lebih baik
marc_s

Terima kasih semuanya. Maaf, saya hanya pemula untuk SQL.
Paisal

1
Ketahuilah, MSSQL 2012 (saya rasa versi yang lebih lama juga) akan mengonversi datetime ke varchar sebagai '2014-01-06T16: 18: 00.045', jadi ingatlah ini jika Anda mencoba mencocokkan untuk jam / menit juga.
balint

Satu-satunya masalah yang saya miliki dengan pemilihan sql di atas adalah ini: WHERE CONVERT(VARCHAR(25), register_date, 25) LIKE '2009-10-10%'
Gabriel Marius Popescu

10

Jika Anda melakukan itu, Anda memaksanya untuk melakukan konversi string. Akan lebih baik untuk membuat rentang tanggal mulai / akhir, dan menggunakan:

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

Ini akan memungkinkan untuk menggunakan indeks (jika ada register_date), daripada pemindaian tabel.


Terima kasih. Maaf, saya hanya pemula untuk SQL.
Paisal

8

Anda dapat menggunakan CONVERT untuk mendapatkan tanggal dalam bentuk teks. Jika Anda mengubahnya menjadi varchar (10), Anda dapat menggunakan = sebagai ganti like:

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

Atau Anda dapat menggunakan tanggal batas atas dan bawah, dengan keuntungan tambahan yang dapat menggunakan indeks:

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

Saya pikir ada kesalahan ketik di mana klausa, seharusnya "where '2009-10-10'> = register_date"
Vishwanath Dalvi

@mr_eclair: tidak berpikir begitu, itu akan mencakup setiap tanggal sebelum 11 Okt
Andomar

8

Sayangnya, tidak mungkin membandingkan datetime dengan varchar menggunakan 'LIKE' Tapi keluaran yang diinginkan dimungkinkan dengan cara lain.

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

3

Anda juga dapat menggunakan convert agar tanggal dapat dicari menggunakan LIKE. Sebagai contoh,

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

2

The LIKEoperator tidak bekerja dengan bagian-bagian tanggal seperti bulan atau tanggal tetapi DATEPARToperator yang tidak.

Perintah untuk mengetahui semua akun yang Open Date-nya pada tanggal 1:

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

* CASTING OpenDtkarena nilainya masuk DATETIMEdan tidak adil DATE.


2

Coba ini

SELECT top 10 * from record WHERE  IsActive = 1 and CONVERT(VARCHAR, register_date, 120) LIKE '2020-01%'

1

Ada cakupan yang sangat tidak pasti dari operator LIKE untuk tanggal di SQL Server. Ini hanya berfungsi menggunakan format tanggal Amerika. Sebagai contoh Anda bisa mencoba:

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

Saya telah menguji ini di SQL Server 2005 dan berhasil, tetapi Anda benar-benar perlu mencoba kombinasi yang berbeda. Hal-hal aneh yang saya perhatikan adalah:

  • Anda sepertinya hanya mendapatkan semua atau tidak sama sekali untuk sub bidang yang berbeda dalam tanggal, misalnya, jika Anda mencari 'apr 2%' Anda hanya mendapatkan apa pun di bagian 20 - itu menghilangkan 2.

  • Menggunakan satu garis bawah '_' untuk mewakili satu karakter (wildcard) tidak sepenuhnya berfungsi, misalnya, tidakWHERE mydate LIKE 'oct _ 2010%' akan mengembalikan semua tanggal sebelum tanggal 10 - sebenarnya tidak mengembalikan apa-apa!

  • Formatnya kaku Amerika: ' mmm dd yyyy hh:mm'

Saya merasa sulit untuk menyelesaikan proses untuk MENYUKAI detik, jadi jika ada yang ingin melangkah lebih jauh, jadilah tamu saya!

Semoga ini membantu.


1

Saya agak terlambat ke utas ini tetapi sebenarnya ada dukungan langsung untuk operator sejenis di server MS SQL.

Seperti yang didokumentasikan dalam LIKE help jika tipe data bukan string, ia berusaha mengubahnya menjadi string. Dan seperti yang didokumentasikan dalam dokumentasi cast \ convert:

konversi datetime default ke string adalah tipe 0 (, 100) yang mon dd yyyy hh: miAM (atau PM).

Jika Anda memiliki tanggal seperti ini di DB:

2015-06-01 11:52:59.057

dan Anda melakukan kueri seperti ini:

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'

Anda mendapatkan baris itu.

Namun, format tanggal ini menunjukkan bahwa itu adalah DateTime2 , kemudian dokumentasinya mengatakan:

21 atau 121 - ODBC kanonis (dengan milidetik) default untuk time, date, datetime2, dan datetimeoffset. - tttt-bb-hh jj: mi: ss.mmm (24j)

Itu membuatnya lebih mudah dan Anda dapat menggunakan:

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

dan dapatkan catatan faktur. Berikut adalah kode demo:

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%';

Melakukan pencarian datetime di SQL server tanpa konversi ke string selalu bermasalah. Mendapatkan setiap bagian tanggal adalah berlebihan (yang tidak mungkin menggunakan indeks). Mungkin cara yang lebih baik ketika Anda tidak menggunakan konversi string adalah dengan menggunakan pemeriksaan rentang. yaitu:

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

0

Saya memecahkan masalah saya dengan cara itu. Terima kasih atas saran perbaikannya. Contoh di 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 + "%'";
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.