Microsoft SQL Server'da yalnızca tarih kullanarak DATETIME alanını nasıl sorgulayabilirim?


90

Şunun DATETIMEgibi bir alanı olan bir tablo TEST'im var :

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

Ne zaman olursa olsun bu satırı ve 03/19/2014 tarihli her satırı döndüren bir sorguya ihtiyacım var. Kullanmayı denedim

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

Ancak hiçbir satır döndürmez. Bulduğum işe yaraması için tek yol, tarihin saat kısmını da sağlamaktır:

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

Yanıtlar:


129

aralık veya DateDiff işlevini kullanın

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

veya

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

Diğer seçenekler şunlardır:

  1. Veritabanı şeması üzerinde kontrole sahipseniz ve zaman verilerine ihtiyacınız yoksa, onu çıkarın.

  2. veya tutmanız gerekiyorsa, tarih değerinin saat kısmının çıkarıldığı hesaplanmış bir sütun özelliği ekleyin ...

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

veya SQL Server'ın daha yeni sürümlerinde ...

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

daha sonra sorgunuzu şu şekilde yazabilirsiniz:

select * from test 
where DateOnly = '03/19/2014'

Tamam, bu işe yarıyor, ama daha kolay bir yolu olup olmadığını merak ediyordum.
delphirules

Pekala, diğer kolay yol, ilk etapta veri tabanına zaman verisi koymamak ... ya da zaman kısmını çıkaran ve onu kullanan hesaplanmış bir öznitelik oluşturmak değil ... Her iki seçeneği de cevabıma ekledim.
Charles Bretana

DATEDIFF yönteminin 4/19/2014 veya 3/19/2015 gibi tarihler için doğru (istenmeden) döneceğinden endişeliydim, çünkü bu tarihlerin 'gün' kısmı aynıdır (ve başka bir yerde raporlar görmüştüm bu şekilde hareket et), ancak bir veritabanına karşı test ettim ve düzgün çalışıyor gibi görünüyor.
mono código

Evet, çünkü DateDiff()işlev tüm varyantlarında, frlom'u bir tarihten diğerine götürmek için geçilmesi gereken tarih sınırlarının sayısını hesaplar ve döndürür . Bu yüzden DateDiff(day, '1Jan2016', '31Dec2017 23:259:59')ve DateDiff(day, '31Dec2016 23:259:59', '1Jan2017 ') ikisi de geri dönüyor 1.
Charles Bretana

56

Basit cevap;

select * from test where cast ([date] as date) = '03/19/2014';

Bu geçerli bir cevap olsa da, herhangi bir fonksiyonun arkasında değerlendirme yaparak tarih alanını koymanın performans sorunlarına yol açacağına işaret etmek istiyorum. Tarihteki herhangi bir dizin işe yaramayacak ve motorun her satırı değerlendirmesi gerekecek
jean


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

Bu gerçekten kötü bir cevap. İki nedenden dolayı.

1. 23.59.59.700 gibi zamanlarda ne olur. 23:59:59 ve sonraki günden daha büyük zamanlar vardır.

2. Davranış, veri türüne bağlıdır. Sorgu, tarih saat / tarih / tarih saat2 türleri için farklı davranır.

23: 59: 59.999 ile test etmek durumu daha da kötüleştirir çünkü veri türüne bağlı olarak farklı yuvarlamalar elde edersiniz.

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

- Tarih için değer 'kesildi'. - Tarih saat için, değer sonraki tarihe yuvarlanır. (En yakın değer). - Tarih saat2 için değer kesindir.


7

Bu benim için MS SQL sunucusu için çalışıyor:

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

1

Bunu dene

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

1

bunu deneyebilirsin

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

1
Teşekkürler ama bence daha basit çözüm, tıpkı önceki çözümde olduğu gibi zamanla karşılaştırma olurdu.
delphirules

0

Zaman bölümünü kısaltan bu yaklaşımı kullanabilirsiniz:

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
Lütfen cevabınıza bir açıklama ekleyin!
ρss

Bu işe yaramıyor çünkü '2015/10/28 00: 00.001' '2015/10/28' den farklı
PedroC88

0

Bunu sadece cümlenizde kullanın WHERE.

Aşağıdaki "Gönderme Tarihi" bölümü sütun adıdır, bu nedenle kendi adınızı girin.

Bu, sonuçların yalnızca "Yıl" bölümünü döndürür, dakikaları vb. Çıkarır.

Where datepart(year, SubmitDate) = '2017'

0
select *, cast ([col1] as date) <name of the column> from test where date = 'mm/dd/yyyy'

"col1", tarih ve saatle
birlikte sütunun adıdır <sütunun adı> buradan adı istediğiniz gibi değiştirebilirsiniz


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


0

bunu kullan

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

-1

Bu sorguyu test edin.

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

Bunun Oracle sözdizimi olduğunu düşünüyorum, sql sunucusunda çalışmıyor
ceinmart

-2
SELECT * FROM test where DATEPART(year,[TIMESTAMP]) = '2018'  and  DATEPART(day,[TIMESTAMP]) = '16' and  DATEPART(month,[TIMESTAMP]) = '11'
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.