2010-04-06 34 views
33

Trong sql 2005, thay vì xây dựng một truy vấn từ dateparts năm, tháng và ngày,Nhận hàng nơi datetime column = ngày nay - SQL server Noob

là có một cách gọn gàng hơn viết mệnh đề ở đâu?

+0

Tôi tự hỏi liệu có bất kỳ câu trả lời nào ngắn gọn hơn điều này không. Tôi thấy điều này dễ đọc hơn. nơi (DATEPART (yy, myColum) = '2010') VÀ (DATEPART (mm, myColum) = '4') VÀ (DATEPART (đ, myColum) = '7'); – Chin

+1

** @ Chin, phương pháp của bạn sẽ ngăn chặn việc sử dụng chỉ mục và sẽ dẫn đến việc quét bảng chậm. ** Tôi thực sự khuyên bạn KHÔNG BAO GIỜ nên tìm kiếm dựa trên ngày sử dụng phương pháp đó. Bạn cần "sàn" các ngày trong phạm vi và không áp dụng hàm nào cho cột nếu bạn muốn sử dụng chỉ mục. đây là cách tầng một datetime: http://stackoverflow.com/questions/85373/floor-a-date-in-sql-server –

+0

@KM, cảm ơn vì điều đó. Tôi nghĩ tôi sẽ hỏi và xem liệu tôi có rời khỏi căn cứ không. Hiện tại tôi không biết về chỉ mục trên cột này. Tôi sẽ giữ điều này trong tâm trí mặc dù và sàn ngày của tôi như bạn đã gợi ý. – Chin

Trả lời

22

Trong SQL 2000 và SQL 2005 bạn có thể sử dụng một lựa chọn công bố tốt đẹp để loại bỏ các thành phần thời gian từ một DateTime, tức là

SELECT DATEADD(dd, DATEDIFF(dd,0,GETDATE()), 0) 

sẽ trở lại 6 -Apr-2010 (chỉ dành cho ngày hôm nay).

Vì vậy, kết hợp với câu trả lời marc_s, bạn muốn

SELECT (list of fields) 
FROM dbo.YourTable 
WHERE dateValue BETWEEN DATEADD(dd, DATEDIFF(dd,0,'MY Date and Time, But I Only Want Date'), 0) 
AND DATEADD(dd, DATEDIFF(dd,0,'MY Date and Time, But I Only Want Date'), 1) 

Chỉnh sửa: Thay đổi cho phù hợp với yêu cầu, lưu ý là 1 trong DateAdd thứ hai (điều này cho biết thêm những ngày nó đã được từ đầu đến 1 (thay vì 0), làm cho nó 7 tháng 4 năm 2010 00:00:00) Nếu bạn muốn ngày 06 tháng 4 23:59:59 bạn lấy đi từ ngày thứ hai một giây

DATEADD(ss,-1,'My DateTime') 

Gọi cuối cùng sẽ trở thành

DATEADD(ss,-1,DATEADD(dd, DATEDIFF(dd,0,'MY Date and Time, But I Only Want Date'), 1)) 

Ok đó là rất nhiều thông tin cùng một lúc! Hy vọng tất cả có ý nghĩa :)

+0

Tôi thích biểu hiện của bạn để có được phần chỉ ngày tốt hơn so với giải pháp của tôi - nhưng lựa chọn này sẽ không hoạt động, không ?? Nếu bạn có '2010-04-06 15:15:15' - làm cách nào để so sánh điều đó với phần chỉ ngày sẽ chọn mục đó ?? Tôi nghĩ bạn cần một 'WHERE dateValue BETWEEN (hôm nay) AND (hôm nay + 1 ngày)' loại chọn để lấy tất cả các giá trị ngày hôm nay với bất kỳ phần thời gian nào gắn liền với chúng .... –

+1

Nếu bạn muốn phá hủy hoàn toàn các chỉ mục , bạn có thể sử dụng DateAdd/DatePart trên DateValue, nhưng đó là một ý tưởng tồi! (Nếu bạn có chỉ mục tốt :)) – PostMan

+0

Tôi đã có thời gian từ 23: 59: 59.000 và 00: 00: 00.000 ngày hôm sau bị loại khỏi báo cáo. vì vậy tôi sẽ không bao giờ sử dụng phương thức "trừ một giây". Tốt hơn là giữ thời gian ở 00: 00: 000.000 và tăng thêm một ngày và chỉ sử dụng "<" ít hơn (yourColumn

25

Mở SQL Server 2008, bạn sẽ có một loại DATE dữ liệu mới, mà bạn có thể sử dụng để đạt được điều này:

SELECT (list of fields) 
FROM dbo.YourTable 
WHERE dateValue BETWEEN 
    CAST(GETDATE() AS DATE) AND DATEADD(DAY, 1, CAST(GETDATE() AS DATE)) 

Các CAST(GETDATE() AS DATE) phôi ngày và thời gian hiện tại để một giá trị ngày tháng chỉ, ví dụ trả lại '2010-04-06' cho ngày 6 tháng 4 năm 2010. Thêm một ngày vào đó về cơ bản chọn tất cả các giá trị ngày giờ của ngày hôm nay.

Trong SQL Server 2005, không có cách nào dễ dàng để làm điều này - các giải pháp thanh lịch nhất I found here đang sử dụng thao tác số của DATETIME để đạt được kết quả tương tự:

SELECT (list of fields) 
FROM dbo.YourTable 
WHERE dateValue BETWEEN 
    CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME) AND 
    DATEADD(DAY, 1, CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)) 
+0

@marc_s - bạn vừa xóa câu trả lời? làm tôi bối rối khi tôi đang cố thêm bình luận. Nếu tôi chỉ nâng cấp cud. Cảm ơn sự giúp đỡ của bạn mặc dù nhiều đánh giá cao. – Chin

+0

@Chin: vâng, tôi có câu trả lời ngớ ngẩn trước tiên, xóa nó, chỉnh sửa và bỏ xóa nó lần nữa :-) –

+0

@marc_s: Bạn chắc chắn có một định nghĩa sai lệch về từ "thanh lịch", +1 :) –

1

cái gì đó dọc theo dòng của

này
CONVERT(date,tbldata.date)=CONVERT(date,getdate()) 

Điều này giả định rằng cột ngày cũng bao gồm thời gian. Nếu không thì bạn có thể thay đổi nó để

tbldata.date=CONVERT(date,getdate()) 
+0

Sql Server 2005 có kiểu 'date'? ;) –

+0

Tắt nó không. Chồng hiện tại của tôi là SQL Server 2008 đã được một thời gian kể từ khi chúng tôi nâng cấp và tôi giả định rằng năm 2005 đã có tính năng này. –

4

hiệu suất Không tốt, nhưng một giải pháp:

SELECT * 
FROM tblDate 
WHERE CONVERT(VARCHAR, date, 112) = CONVERT(VARCHAR, GETDATE(), 112); 

Nếu nó là một truy vấn phổ biến một cột tính nên được bổ sung với nội dung chỉ năm-tháng-ngày.

+0

bạn là chính xác, nó sẽ chậm, vì không có chỉ mục nào được sử dụng –

0

Tôi đã sử dụng một UDF để làm điều này trên các cột datetime sẽ trở lại SQL 2000.

CREATE FUNCTION [dbo].[GETDATENOTIME](@now datetime) 
RETURNS smalldatetime 
AS 
BEGIN 
    RETURN (CONVERT(smalldatetime, CONVERT(varchar, @now, 112))) 
END 

Cách sử dụng:

DECLARE @date smalldatetime 
SET @date = '4/1/10' 
SELECT * FROM mytable WHERE dbo.GETDATENOTIME(date) = @date 

Không điều hiệu quả nhất trên thế giới (YMMV tùy thuộc vào bàn của bạn) nhưng nó thực hiện công việc.Đối với các bảng mà tôi biết tôi sẽ chọn dựa trên ngày không có thời gian, tôi sẽ có một cột cụ thể cho điều đó với một bộ mặc định là dbo.GETDATENOTIME (GETDATE()).

+1

nếu bạn đã từng có chỉ mục trên cột "ngày", điều này chắc chắn sẽ không thể sử dụng nó và do đó dẫn đến việc quét bảng .... –

+0

Do đó tuyên bố từ chối trách nhiệm của tôi ở cuối. OP yêu cầu cú pháp ngắn gọn, vì vậy đó là câu trả lời tôi đưa cho anh ta. – Dane

Các vấn đề liên quan