SQL Server'da bir zaman öğesi içeren bir DATETIME
sütunum var.
Örnek:
'14 AUG 2008 14:23:019'
Zaman kısmını göz ardı ederek yalnızca belirli bir güne ait kayıtları seçmek için en iyi yöntem nedir?
Örnek: (Zaman kısmıyla eşleşmediği ve satır döndürmediği için güvenli değildir)
DECLARE @p_date DATETIME
SET @p_date = CONVERT( DATETIME, '14 AUG 2008', 106 )
SELECT *
FROM table1
WHERE column_datetime = @p_date
Not: Bu site aynı zamanda aldığınız ve sonra unuttuğunuz notları ve teknikleri not etmekle ilgili olduğundan, MSSQL'deki DATETIME öğeleri muhtemelen SQLBOL'da en çok baktığım konu olduğundan, bu soruya kendi cevabımı göndereceğim.
Güncelleme Daha spesifik olması için örnek netleştirildi.
Düzenle Üzgünüm, ancak YANLIŞ cevapları (yanlış sonuçlar döndüren cevaplar) değiştirmek zorunda kaldım.
@Jorrit: WHERE (date>'20080813' AND date<'20080815')
ayın 13'ünü ve 14'ünü döndürecektir.
@wearejimbo: Yaklaştı, ama puro yok! rozeti size verildi. 14/08/2008 23:59:001 ile 23:59:999 (yani gece yarısına 1 saniyeden az kala) arasında yazılan kayıtları kaçırdınız.
Teknik 1:
DECLARE @p_date DATETIME
SET @p_date = CONVERT( DATETIME, '14 AUG 2008', 106 )
SELECT *
FROM table1
WHERE column_datetime >= @p_date
AND column_datetime < DATEADD(d, 1, @p_date)
Bunun avantajı, eğer varsa 'column_datetime' üzerindeki herhangi bir dizini kullanacak olmasıdır.
Teknik 2:
DECLARE @p_date DATETIME
SET @p_date = CONVERT( DATETIME, '14 AUG 2008', 106 )
SELECT *
FROM table1
WHERE DATEDIFF( d, column_datetime, @p_date ) = 0
column_datetime alanı indekslenmemişse ve indekslenme olasılığı düşükse (veya indeks kullanılmayacaksa), DATEDIFF() kullanmak daha kısadır.
SELECT *
FROM table1
WHERE CONVERT(varchar(10),columnDatetime,121) =
CONVERT(varchar(10),CONVERT('14 AUG 2008' ,smalldatetime),121)
Bu, veri zamanını ve dizeyi "YYY-MM-DD" biçimindeki karakterlere dönüştürecektir.
Bu çok çirkin ama işe yaramalı