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

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'

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

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.


7

Ini berfungsi untuk saya untuk server MS SQL:

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

1

Coba ini

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

1

kamu bisa mencoba ini

select * from test where DATEADD(dd, 0, DATEDIFF(dd, 0, date)) = '03/19/2014';

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)

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'

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'

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


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

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

0

Gunakan ini

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

-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

-1
select * from invoice where TRANS_DATE_D>= to_date  ('20170831115959','YYYYMMDDHH24MISS')
and TRANS_DATE_D<= to_date  ('20171031115959','YYYYMMDDHH24MISS');

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'
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.