2008-10-03 32 views

Trả lời

12
SELECT DATEADD(ms, -2, DATEADD(dd, 1, DATEDIFF(dd, 0, GetDate()))) 

Tôi nghĩ bạn có C# lúc đầu .. Tôi sẽ để điều này ở đây trong trường hợp bất kỳ ai khác tình cờ gặp vấn đề này.

DateTime now = DateTime.Now; 
DateTime endofDay = now.Date.AddDays(1).AddMilliseconds(-1); 

Bạn có thể thay thế 'bây giờ' biến với bất cứ điều gì trong ngày bạn đang cố gắng tìm ra

+0

kiểm tra thẻ - anh muốn làm điều đó trong TSQL – Danimal

+0

câu trả lời tốt nhất IMO –

22

Câu trả lời là SELECT DATEADD(ms, -3, '2008-01-24'), giải thích là bên dưới.

Từ Marc's blog:

Nhưng chờ đợi, Marc ... bạn nói bạn muốn sử dụng BETWEEN, nhưng truy vấn mà không có một ... đó là bởi vì BETWEENis inclusive, có nghĩa là nó bao gồm các thúc- điểm. Nếu tôi có một Đơn hàng đến hạn vào nửa đêm của ngày đầu tiên của tháng tiếp theo, nó sẽ được bao gồm. Vậy làm thế nào để bạn có được giá trị thích hợp cho một giai đoạn cuối? Đó chắc chắn là KHÔNG bằng cách sử dụng các bộ phận ngày để lắp ráp một (nhưng bạn phải, hãy nhớ rằng đó là 23: 59: 59.997 là thời gian tối đa ... đừng quên mili giây). Để làm điều đó đúng, chúng tôi sử dụng kiến ​​thức loạn luân rằng các cột Microsoft SQL Server DATETIMEtối đa độ phân giải 3 mili giây (thứ gì đó sẽ không thay đổi). Vì vậy, tất cả những gì chúng tôi làm là trừ 3 mili giây từ bất kỳ công thức cuối kỳ nào đã nêu ở trên. Ví dụ, ngay lập tức có thể cuối cùng của ngày hôm qua (giờ địa phương) là:

SELECT DATEADD(ms, -3, DATEADD(dd, DATEDIFF(dd, 0, GetDate()), 0)) 

Vì vậy, để thực hiện đơn đặt hàng do trong tháng này như một truy vấn BETWEEN, bạn có thể sử dụng này:

SELECT [ID] 
    FROM [dbo].[Orders] 
    WHERE [ShipDue] BETWEEN DATEADD(mm, DATEDIFF(mm, 0, GetUTCDate()), 0) 
    AND DATEADD(ms, -3, DATEADD(mm, DATEDIFF(mm, 0, GetUTCDate()) + 1, 0)) 

Hãy nhớ rằng, luôn hãy đảm bảo rằng bạn thực hiện toán học dựa vào tham số đầu vào, các cột NOT hoặc bạn sẽ mất khả năng truy cập của SARG, có nghĩa là các chỉ mục có thể đã được sử dụng thì không.

+0

Xin lỗi nhưng điều này được lựa chọn thời điểm gần nhất của ngày trước ngày tôi muốn ..... chứ không phải là ngày hôm đó đặc biệt – test

+0

Đây là tuyệt quá! Một cách thực sự, rất dễ dàng để kết thúc một ngày. – Pandincus

8

Add -1 mili giây đến bắt đầu của ngày hôm sau (DateAdd thậm chí hỗ trợ nano giây, nếu bạn muốn để có được tốt thực).

Nhưng rất có thể bạn chỉ muốn sử dụng giá trị này trong so sánh và trong trường hợp đó, nó thậm chí còn đơn giản hơn.

Thay vì một cái gì đó như thế này:

AND @CompareDate <= [LastTimeforThatday] 

hay này:

@compareDate BETWEEN [StartDate] AND [LastTimeforThatday] 

Làm điều đó như thế này:

AND @CompareDate < [BeginningOfNextDay] 

hay này:

AND (@CompareDate >= [StartDate] AND @CompareDate < [BeginningOfNextDay]) 
+0

Như bạn nói, loại trừ điểm cuối là một cách tiếp cận rất ổn định cho những vấn đề này. Nó cũng cho phép thời lượng được tính toán mà không cần fudging. –

1

Tại sao lại vào nó?

SELECT DATEADD(ms, 86399997, *yourDate*) 
Các vấn đề liên quan