DATETIME ve DATE yoksayma zaman bölümünü karşılaştırın


151

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:


252

Yalnızca tarih bölümünü karşılaştırmak için SQL Server 2008'deki CASTyeni DATEveri türünü kullanın :

IF CAST(DateField1 AS DATE) = CAST(DateField2 AS DATE)

61

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.

  • Dizine alınan tarih alanına (DF1 deyin) herhangi bir işlevle dokunulmamalıdır.
  • Bu nedenle, DF1'i DF2 günü için tüm tarih-saat değerleriyle karşılaştırmanız gerekir.
  • Bu, DF2'nin tarih kısmından DF2'den sonraki günün tarih kısmına kadardır.
  • yani (DF1 >= CAST(DF2 AS DATE)) AND (DF1 < DATEADD(dd, 1, CAST(DF2 AS DATE)))
  • NOT : Karşılaştırmanın DF2 tarihiyle > = (izin verilen eşitlik) ve DF2'den sonraki gün (kesinlikle) < olması çok önemlidir . Ayrıca, BETWEEN operatörü her iki tarafta eşitliğe izin verdiği için çalışmaz.

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.

  • Tarihi bir kayan nokta olarak yayınlayın.
  • Kesirli kısmı kes
  • Değeri bir tarih saatine döndür
  • yani CAST(FLOOR(CAST(DF2 AS FLOAT)) AS DATETIME)

5

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, ymdveya 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, DATETIMEgece 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

3

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

-3

İç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 .....


Bu soruya tam olarak cevap vermiyor. Bir gün değil, bir ay boyunca sorgular.
Curtis Yallop

Mart sorgunuz için: Tarih '31.03.2015' saat 13:00 ise, bulunmaz. <'1/1/2015' kullanmalısınız.
Curtis Yallop

Ayrıca '2015-03-01' uluslararası tarih biçimini kullanmayı düşünün. Kanada'da (ve diğer birçok yerde), resmi bir biçim DD / MM / YYYY'dir ve bu da her iki biçimi de belirsiz ve sorunlu hale getirir.
Curtis Yallop

Bu cevap, soruda istendiği gibi 2 tablo ile ilgilenmez.
Curtis Yallop

Evet katılıyorum, ama ben sadece uluslararası çözüm değil çözüm kanıtlamak .. bazı düzen değiştirmek zorunda ...
pankaj
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.