Bagaimana cara menanyakan bidang DATETIME hanya menggunakan tanggal di Microsoft SQL Server?

90

Saya memiliki TEST tabel dengan DATETIMEbidang, seperti ini:

ID NAME DATE
1 TESTING 2014-03-19 20:05:20.000

Apa yang saya butuhkan kueri mengembalikan baris ini dan setiap baris dengan tanggal 03/19/2014, tidak peduli jam berapa sekarang. Saya mencoba menggunakan

select * from test where date = '03/19/2014';

Tapi tidak ada baris yang dikembalikan. Satu-satunya cara untuk membuatnya berfungsi yang saya temukan adalah juga memberikan bagian waktu pada tanggal:

select * from test where date = '03/19/2014 20:03:02.000';
delphirules.dll
sumber

Jawaban:

129

menggunakan rentang, atau fungsi DateDiff

 select * from test 
 where date between '03/19/2014' and '03/19/2014 23:59:59'

atau

 select * from test 
 where datediff(day, date, '03/19/2014') = 0

Pilihan lainnya adalah:

  1. Jika Anda memiliki kontrol atas skema database, dan Anda tidak memerlukan data waktu, keluarkan.

  2. atau, jika Anda harus menyimpannya, tambahkan atribut kolom terhitung yang bagian waktu dari nilai tanggal dilepas ...

Alter table Test Add DateOnly As DateAdd(day, datediff(day, 0, date), 0)

atau, di versi SQL Server yang lebih baru ...

Alter table Test Add DateOnly As Cast(DateAdd(day, datediff(day, 0, date), 0) as Date)

kemudian, Anda dapat menulis kueri Anda sesederhana:

select * from test 
where DateOnly = '03/19/2014'
Charles Bretana
sumber
Ok, ini berfungsi, tetapi saya bertanya-tanya apakah ada cara yang lebih mudah.
delphirules
Nah, satu-satunya cara lain yang lebih mudah adalah dengan tidak memasukkan data waktu ke dalam database sejak awal ... atau membuat atribut yang dihitung yang menghapus porsi waktu dan menggunakannya ... Saya menambahkan kedua opsi tersebut ke jawaban saya.
Charles Bretana
Saya khawatir bahwa metode DATEDIFF akan mengembalikan true (tidak diinginkan) untuk tanggal seperti 19/4/2014 atau 3/19/2015, karena bagian 'hari' dari tanggal tersebut sama (dan saya telah melihat laporan di tempat lain bahwa itu akan terjadi. bertindak dengan cara ini), tetapi saya mengujinya terhadap database, dan tampaknya berfungsi dengan benar.
mono código
Ya, karena DateDiff()fungsinya, dalam semua variannya, menghitung dan mengembalikan jumlah batas tanggal yang harus disilangkan untuk mendapatkan dari satu tanggal ke tanggal lainnya. Inilah mengapa DateDiff(day, '1Jan2016', '31Dec2017 23:259:59')dan DateDiff(day, '31Dec2016 23:259:59', '1Jan2017 ') keduanya kembali 1.
Charles Bretana
56

Jawaban sederhana;

select * from test where cast ([date] as date) = '03/19/2014';
kabcha
sumber
Meskipun ini adalah jawaban yang valid, saya ingin menunjukkan menempatkan bidang tanggal yang mengevaluasi di belakang fungsi apa pun akan menyebabkan masalah kinerja. Indeks apa pun pada tanggal tersebut tidak akan berguna dan mesin perlu mengevaluasi setiap baris
jean
7
select * from test 
where date between '03/19/2014' and '03/19/2014 23:59:59'

Ini adalah jawaban yang sangat buruk . Karena dua alasan.

1. Apa yang terjadi dengan waktu seperti 23.59.59.700 dll. Ada waktu yang lebih besar dari 23:59:59 dan hari berikutnya.

2. Perilaku tersebut tergantung pada tipe data. Kueri berperilaku berbeda untuk tipe datetime / tanggal / datetime2.

Pengujian dengan 23: 59: 59.999 membuatnya lebih buruk karena tergantung pada tipe data Anda mendapatkan pembulatan yang berbeda.

select convert (varchar(40),convert(date      , '2014-03-19 23:59:59.999'))
select convert (varchar(40),convert(datetime  , '2014-03-19 23:59:59.999'))
select convert (varchar(40),convert(datetime2 , '2014-03-19 23:59:59.999'))

- Untuk tanggal nilainya 'dicincang'. - Untuk tanggal waktu, nilainya dibulatkan ke tanggal berikutnya. (Nilai terdekat). - Untuk datetime2 nilainya tepat.

Ben
sumber
7

Ini berfungsi untuk saya untuk server MS SQL:

select * from test
where 
year(date) = 2015
and month(date) = 10
and day(date)= 28 ;
Jeroen Krah
sumber
1

Coba ini

 select * from test where Convert(varchar, date,111)= '03/19/2014'
Amit
sumber
1

kamu bisa mencoba ini

select * from test where DATEADD(dd, 0, DATEDIFF(dd, 0, date)) = '03/19/2014';
Neraka
sumber
1
Terima kasih, tetapi saya pikir solusi yang lebih sederhana adalah perbandingan dengan waktu, seperti solusi sebelumnya.
delphirules
0

Anda dapat menggunakan pendekatan ini yang memotong bagian waktu:

select * from test
where convert(datetime,'03/19/2014',102) = DATEADD(dd, DATEDIFF(dd, 0, date), 0)
Tim Schmelter
sumber
0
-- Reverse the date format
-- this false:
    select * from test where date = '28/10/2015'
-- this true:
    select * from test where date = '2015/10/28'
Sherif Hamdy
sumber
1
Tolong tambahkan penjelasan untuk jawaban Anda!
ρss
Ini tidak berfungsi karena '2015/10/28 00: 00.001' berbeda dari '2015/10/28'
PedroC88
0

Cukup gunakan ini di file WHERE klausa .

Bagian "SubmitDate" di bawah ini adalah nama kolom, jadi masukkan milik Anda sendiri.

Ini hanya akan mengembalikan bagian "Tahun" dari hasil, menghilangkan menit, dll.

Where datepart(year, SubmitDate) = '2017'
pengguna8161541
sumber
0
select *, cast ([col1] as date) <name of the column> from test where date = 'mm/dd/yyyy'

"col1" adalah nama kolom dengan tanggal dan waktu
<nama kolom> disini anda dapat mengganti nama sesuai keinginan

NGoyal
sumber
0
select *
  from invoice
 where TRUNC(created_date) <=TRUNC(to_date('04-MAR-18 15:00:00','dd-mon-yy hh24:mi:ss'));
PanSQL
sumber
0

Ada masalah dengan tanggal dan bahasa dan cara menghindarinya adalah menanyakan tanggal dengan format ini YYYYMMDD.

Cara di bawah ini harus menjadi yang tercepat menurut tautan di bawah. Saya memeriksa di SQL Server 2012 dan saya setuju dengan tautannya.

select * from test where date >= '20141903' AND date < DATEADD(DAY, 1, '20141903');
mako
sumber
0

Gunakan ini

select * from TableName where DateTimeField > date() and  DateTimeField < date() + 1
akhil
sumber
-1

Uji kueri ini.

SELECT *,DATE(chat_reg_date) AS is_date,TIME(chat_reg_time) AS is_time FROM chat WHERE chat_inbox_key='$chat_key' 
                         ORDER BY is_date DESC, is_time DESC
Programer_saeed
sumber
-1
select * from invoice where TRANS_DATE_D>= to_date  ('20170831115959','YYYYMMDDHH24MISS')
and TRANS_DATE_D<= to_date  ('20171031115959','YYYYMMDDHH24MISS');
khairollah royesh
sumber
Saya pikir ini adalah sintaks Oracle, tidak berfungsi di sql server
ceinmart
-2
SELECT * FROM test where DATEPART(year,[TIMESTAMP]) = '2018'  and  DATEPART(day,[TIMESTAMP]) = '16' and  DATEPART(month,[TIMESTAMP]) = '11'
Kalidas
sumber