SQL Server'da belirli bir tarihten daha büyük olan tüm tarihleri ​​nasıl sorgularım?


338

Deniyorum:

SELECT * 
FROM dbo.March2010 A
WHERE A.Date >= 2010-04-01;

A.Date şuna benzer: 2010-03-04 00:00:00.000

Ancak, bu çalışmıyor.

Neden biri için bir referans sağlayabilir?


17
etrafında tek tırnak koymak
Kevin DiTraglia 17:12

2
Tırnak işaretlerine ek olarak, yalnızca tarih dizesi hazır değerleri için her zaman güvenli ve açık bir biçim kullanmanızı öneririm. Güvendiğim tek kişi YYYYMMDD. Nedeni için David'in cevabına yaptığım yoruma bakın ...
Aaron Bertrand

Yanıtlar:


486
select *  
from dbo.March2010 A 
where A.Date >= Convert(datetime, '2010-04-01' )

Sorgunuzda, 2010-4-01matematiksel bir ifade olarak ele alınır, bu yüzden aslında

select *  
from dbo.March2010 A 
where A.Date >= 2005; 

( 2010 minus 4 minus 1 is 2005 Düzgün bir biçime dönüştürmek datetimeve tek tırnak işareti kullanmak bu sorunu çözecektir.)

Teknik olarak, ayrıştırıcı,

select *  
from dbo.March2010 A 
where A.Date >= '2010-04-01'

sizin için dönüşümü yapacak, ancak bence DateTime, sizden sonra gelecek olan bir bakım programcısı için açıkça dönüştürülmekten daha az okunabilir .


37
Açık dönüştürme gerekli değildir. Ayrıca YYYY-AA-GG yerine YYYYAAGG kullanmanızı tavsiye ederim. Neden? Kodunuzu deneyin SET LANGUAGE FRENCH. :-) Bu tarih için 1 Nisan yerine 4 Ocak alacaksınız. Diğer tarihler için bunun yerine bir hata alabilirsiniz.
Aaron Bertrand

4
@Aaron Bertrant - Cevabım, "Teknik olarak, pareser <son kod örneği> ile kurtulmanıza izin verebilir, dönüşümün gerekli olmadığını içeriyordu. Sadece daha okunabilir buluyorum, çünkü bunun bir tarih-saati Çok fazla Veritabanı Sistemi varchar alanında tarih değerlerini saklar, ancak biçim konusunda haklısınız.Normalde, dönüşüm kullanırken biçim belirleyicisine de ekliyorum, ancak örneğimin üstünden yapıyordum kafa.
David

1
@AaronBertrand, önerinizi yukarıdaki cevap ile birlikte kullanmak zorunda kaldı: CONVERT(datetime, '20100401 10:01:01')- 2010-04-01 geçen SQL Server Management Studio çalışır ama PHP / MSSQL yoluyla SQL deyimi gönderirken değil.
ataç

Bunun bir tarih olması yeterince açık ve bence dönüşüm gerekli değil.
Jacques Mathieu

56

Tarihinizi bir karakter dizesine eklemeyi deneyin.

 select * 
 from dbo.March2010 A
 where A.Date >= '2010-04-01';

2
Zaman eklemek kesin sonuç verecektir: Burada A.Date> = 2014-01-12 12:28:00
shaijut

16

Aşağıdaki gibi de kullanabiliriz

SELECT * 
FROM dbo.March2010 A
WHERE CAST(A.Date AS Date) >= '2017-03-22';

SELECT * 
    FROM dbo.March2010 A
    WHERE CAST(A.Date AS Datetime) >= '2017-03-22 06:49:53.840';

2
Filtre yüklem sütununu değiştirmek iyi bir fikir değildir. Endeks kullanımını neredeyse tamamen önler.
pimbrouwers

3
DateTime start1 = DateTime.Parse(txtDate.Text);

SELECT * 
FROM dbo.March2010 A
WHERE A.Date >= start1;

Önce TexBox'ı Datetime'a çevirin, sonra ... bu değişkeni Sorguya kullanın


3

Hepsini özetlemek için doğru cevap:

select * from db where Date >= '20100401'  (Format of date yyyymmdd)

Bu, diğer dil sistemleriyle ilgili herhangi bir sorunu önler ve dizini kullanır.

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.