Sütun [date]
türü olduğu iki tablo var DATETIME2(0)
.
Zaman parçalarını (saat + dakika + saniye) atarak yalnızca tarih kayıtlarını (gün + ay + yıl) göre iki kaydı karşılaştırmam gerekir.
Bunu nasıl yapabilirim?
Sütun [date]
türü olduğu iki tablo var DATETIME2(0)
.
Zaman parçalarını (saat + dakika + saniye) atarak yalnızca tarih kayıtlarını (gün + ay + yıl) göre iki kaydı karşılaştırmam gerekir.
Bunu nasıl yapabilirim?
Yanıtlar:
Marc'ın cevabındaki küçük bir dezavantaj, her iki tarih alanının da dakik olduğu, yani herhangi bir dizinden yararlanamayacağınızdır.
Bu nedenle, bir tarih alanında bir dizinden yararlanabilecek bir sorgu yazmaya ihtiyaç varsa, aşağıdaki (oldukça kıvrık) yaklaşım gereklidir.
(DF1 >= CAST(DF2 AS DATE)) AND (DF1 < DATEADD(dd, 1, CAST(DF2 AS DATE)))
Not: Yalnızca tarihi ayıklamanın başka bir yolu (SQL Server'ın eski sürümlerinde), tarihin dahili olarak nasıl temsil edildiğine ilişkin bir numara kullanmaktır.
CAST(FLOOR(CAST(DF2 AS FLOAT)) AS DATETIME)
Doğru olarak işaretlenmiş cevabı iptal ettim. Bunun üzerine tökezleyen herkes için birkaç şeye değinmek istedim.
Genel olarak, özellikle yalnızca Tarih değerlerine filtre uyguluyorsanız. Microsoft, ymd
veya dilinin nötr biçimini kullanmanızı önerir y-m-d
.
'2007-02-12' biçiminin yalnızca DATE, DATETIME2 ve DATETIMEOFFSET veri türleri için dilden bağımsız olarak değerlendirildiğini unutmayın.
Yukarıda belirtilen yaklaşımı kullanarak tarih karşılaştırması yapmak basittir. Aşağıdaki, tartışmalı örneği ele alalım.
--112 is ISO format 'YYYYMMDD'
declare @filterDate char(8) = CONVERT(char(8), GETDATE(), 112)
select
*
from
Sales.Orders
where
CONVERT(char(8), OrderDate, 112) = @filterDate
Mükemmel bir dünyada, SQL Server'ın dizinleri verimli bir şekilde kullanmasını engelleyebileceğinden, filtrelenmiş sütunda herhangi bir manipülasyon gerçekleştirmekten kaçınılmalıdır. Bununla birlikte, depoladığınız veriler zamanla değil, yalnızca tarihle ilgiliyse, DATETIME
gece yarısı olduğu gibi saklamayı saat olarak düşünün . Çünkü:
SQL Server değişmezi filtrelenmiş sütunun türüne dönüştürdüğünde, bir zaman parçası belirtilmediğinde gece yarısını varsayar. Böyle bir filtrenin belirtilen tarihten tüm satırları döndürmesini istiyorsanız, tüm değerleri gece yarısı gece yarısı ile sakladığınızdan emin olmanız gerekir.
Böylece, yalnızca tarihle ilgilendiğinizi varsayarak verilerinizi bu şekilde depolayın. Yukarıdaki sorgu basitleştirilebilir:
--112 is ISO format 'YYYYMMDD'
declare @filterDate char(8) = CONVERT(char(8), GETDATE(), 112)
select
*
from
Sales.Orders
where
OrderDate = @filterDate
Bunu deneyebilirsin
CONVERT(DATE, GETDATE()) = CONVERT(DATE,'2017-11-16 21:57:20.000')
MS SQL 2014 için aşağıdaki kodu test ediyorum
select case when CONVERT(DATE, GETDATE()) = CONVERT(DATE,'2017-11-16 21:57:20.000') then 'ok'
else '' end
İçin AA / GG / YYYY ile AA / GG / YYYY gibi iki tarihi karşılaştırın . Unutmayın Alanın ilk şey sütun türü dateTime olmalıdır. Örnek: columnName: payment_date dataType: DateTime .
bundan sonra kolayca karşılaştırabilirsiniz. Sorgu:
select * from demo_date where date >= '3/1/2015' and date <= '3/31/2015'.
Çok basit ...... Test etti .....