Bagaimana cara kueri untuk semua tanggal yang lebih besar dari tanggal tertentu di SQL Server?

338

Saya mencoba:

SELECT * 
FROM dbo.March2010 A
WHERE A.Date >= 2010-04-01;

A.Date seperti: 2010-03-04 00:00:00.000

Namun, ini tidak berfungsi.

Adakah yang bisa memberikan referensi mengapa?

Eric Francis
sumber
17
letakkan tanda kutip tunggal di sekitarnya
Kevin DiTraglia
2
Selain kutipan, saya sarankan selalu menggunakan format aman dan tidak ambigu untuk string literal hanya tanggal. Satu-satunya yang saya percayai adalah YYYYMMDD. Lihat komentar saya untuk jawaban David dengan alasan mengapa ...
Aaron Bertrand

Jawaban:

486
select *  
from dbo.March2010 A 
where A.Date >= Convert(datetime, '2010-04-01' )

Dalam kueri Anda, 2010-4-01diperlakukan sebagai ekspresi matematis, jadi intinya itu dibaca

select *  
from dbo.March2010 A 
where A.Date >= 2005; 

( 2010 minus 4 minus 1 is 2005 Mengubahnya menjadi layak datetime, dan menggunakan tanda kutip tunggal akan memperbaiki masalah ini.)

Secara teknis, parser memungkinkan Anda untuk lolos

select *  
from dbo.March2010 A 
where A.Date >= '2010-04-01'

itu akan melakukan konversi untuk Anda, tetapi menurut saya itu kurang mudah dibaca daripada secara eksplisit mengkonversi ke DateTimeuntuk programmer pemeliharaan yang akan datang setelah Anda.

David
sumber
37
Konversi eksplisit tidak perlu. Saya juga sangat merekomendasikan menggunakan YYYYMMDD daripada YYYY-MM-DD. Mengapa? Nah, coba kode Anda dengan SET LANGUAGE FRENCH. :-) Untuk tanggal itu Anda akan mendapatkan 4 Januari bukannya 1 April. Untuk tanggal lain, Anda mungkin akan mendapatkan kesalahan.
Aaron Bertrand
4
@ Harun Bertrant - Jawaban saya memang termasuk bahwa konversi tidak perlu, dimulai dengan "Secara teknis, pareser mungkin membiarkan Anda pergi dengan <sampel kode akhir>. Saya hanya merasa lebih mudah dibaca, karena sangat jelas bahwa ini adalah tanggal-waktu. Terlalu banyak Sistem Database menyimpan nilai tanggal dalam bidang varchar, tetapi Anda benar tentang formatnya. Biasanya, ketika menggunakan konversi saya menambahkan dalam penentu format juga, tapi saya melakukan sampel saya di atas saya kepala
David
1
@ AaronBertrand, saya harus menggunakan saran Anda bersamaan dengan jawaban di atas: CONVERT(datetime, '20100401 10:01:01')- melewati 2010-04-01 bekerja di SQL Server Management Studio tetapi tidak ketika mengirim pernyataan SQL melalui PHP / MSSQL.
penjepit kertas
Saya pikir sudah cukup jelas bahwa ini adalah tanggal, dan dengan demikian konversi tidak perlu.
Jacques Mathieu
56

Coba lampirkan tanggal Anda ke dalam string karakter.

 select * 
 from dbo.March2010 A
 where A.Date >= '2010-04-01';
SliverNinja - MSFT
sumber
2
Menambahkan waktu akan memberikan hasil yang tepat: di mana A. Tanggal> = 2014-01-12 12:28:00
shaijut
16

Kita bisa menggunakan seperti di bawah ini juga

SELECT * 
FROM dbo.March2010 A
WHERE CAST(A.Date AS Date) >= '2017-03-22';

SELECT * 
    FROM dbo.March2010 A
    WHERE CAST(A.Date AS Datetime) >= '2017-03-22 06:49:53.840';
dush88c
sumber
2
Memodifikasi kolom predikat filter bukanlah ide yang baik sama sekali. Ini mencegah penggunaan indeks hampir seluruhnya.
pimbrouwers
3
DateTime start1 = DateTime.Parse(txtDate.Text);

SELECT * 
FROM dbo.March2010 A
WHERE A.Date >= start1;

Pertama-tama, konversi TexBox ke dalam Datetime lalu .... gunakan variabel itu ke dalam Query

Suresh Parmar
sumber
3

Singkatnya, jawaban yang benar adalah:

select * from db where Date >= '20100401'  (Format of date yyyymmdd)

Ini akan menghindari masalah dengan sistem bahasa lain dan akan menggunakan indeks.

Dan
sumber