Làm cách nào để tôi truy vấn tất cả các ngày lớn hơn một ngày nhất định trong SQL Server?


338

Tôi đang cô:

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

A.Date giống như: 2010-03-04 00:00:00.000

Tuy nhiên, điều này không hoạt động.

Bất cứ ai có thể cung cấp một tài liệu tham khảo cho lý do tại sao?


17
đặt dấu ngoặc đơn xung quanh nó
Kevin DiTraglia

2
Ngoài dấu ngoặc kép, tôi khuyên bạn luôn luôn sử dụng định dạng an toàn và rõ ràng cho chuỗi ký tự chỉ ngày. Người duy nhất tôi tin tưởng là YYYYMMDD. Xem bình luận của tôi cho câu trả lời của David để biết lý do tại sao ...
Aaron Bertrand

Câu trả lời:


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

Trong truy vấn của bạn, 2010-4-01được coi là một biểu thức toán học, vì vậy về bản chất nó đọc

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

( 2010 minus 4 minus 1 is 2005 Chuyển đổi nó thành phù hợp datetimevà sử dụng dấu ngoặc đơn sẽ khắc phục vấn đề này.)

Về mặt kỹ thuật, trình phân tích cú pháp có thể cho phép bạn thoát khỏi

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

nó sẽ thực hiện chuyển đổi cho bạn, nhưng theo tôi thì nó ít đọc hơn là chuyển đổi rõ ràng sang một DateTimelập trình viên bảo trì sẽ đến sau bạn.


37
Việc chuyển đổi rõ ràng là không cần thiết. Ngoài ra tôi rất khuyên bạn nên sử dụng YYYYMMDD thay vì YYYY-MM-DD. Tại sao? Vâng, hãy thử mã của bạn với SET LANGUAGE FRENCH. :-) Vào ngày đó, bạn sẽ nhận được ngày 4 tháng 1 thay vì ngày 1 tháng 4.
Aaron Bertrand

4
@Aaron Bertrant - Câu trả lời của tôi đã bao gồm rằng việc chuyển đổi là không cần thiết, bắt đầu bằng "Về mặt kỹ thuật, trình xử lý có thể cho phép bạn thoát khỏi <mẫu mã cuối cùng>. Tôi chỉ thấy nó dễ đọc hơn, vì rõ ràng đây là một date-time. Quá nhiều Hệ thống cơ sở dữ liệu lưu trữ các giá trị ngày trong trường varchar, nhưng bạn nói đúng về định dạng. Thông thường, khi sử dụng chuyển đổi, tôi cũng thêm vào công cụ xác định định dạng, nhưng tôi đã thực hiện mẫu của mình từ đầu đầu.
David

1
@AaronBertrand, tôi đã phải sử dụng gợi ý của bạn để kết hợp với câu trả lời ở trên: CONVERT(datetime, '20100401 10:01:01')- vượt qua 2010-04-01 hoạt động trong SQL Server Management Studio nhưng không gửi khi gửi câu lệnh SQL qua PHP / MSSQL.
kẹp giấy

Tôi nghĩ rằng đủ rõ ràng rằng đây là một ngày, và do đó chuyển đổi là không cần thiết.
Jacques Mathieu

56

Hãy thử đính kèm ngày của bạn vào một chuỗi ký tự.

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

2
Thêm thời gian sẽ cho kết quả chính xác: trong đó A.Date> = 2014-01-12 12:28:00
shaijut

16

Chúng ta có thể sử dụng như dưới đây là tốt

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
Sửa đổi cột vị ngữ bộ lọc không phải là một ý tưởng tốt. Nó ngăn chặn việc sử dụng chỉ mục gần như hoàn toàn.
pimbrouwers

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

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

Đầu tiên chuyển đổi TexBox thành Datetime sau đó .... sử dụng biến đó vào Truy vấn


3

Tóm lại, câu trả lời đúng là:

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

Điều này sẽ tránh mọi vấn đề với các hệ thống ngôn ngữ khác và sẽ sử dụng chỉ mục.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.