2009-08-10 31 views
6

Tôi cần phải so sánh hai giá trị datetime để xác định bình đẳng (chính xác như nhau), sử dụng độ chính xác phút.Đây có phải là cách tốt nhất để làm điều đó không? Ngày của tôi có thể có giây và mili giây, nhưng tôi muốn xem xét chỉ xuống đến phút.Xác định tính bình đẳng của các giá trị Ngày giờ với độ chính xác phút trong LINQ

 where (Math.Abs(datetime1.Subtract(datetime2).TotalMinutes) == 0) 
+0

Tôi sẽ lấy đoạn mã đó và đăng câu trả lời cho câu hỏi của bạn, theo cách đó mọi người có thể nhận xét/bỏ phiếu lên hoặc xuống riêng câu hỏi của bạn –

Trả lời

11

Kiểm tra xem Math.Abs(diff.TotalMinutes) == 0 sẽ không làm điều đó, không - đó là kiểm tra xem chúng là chính xác giống nhau không.

Bạn đang cố gắng kiểm tra xem họ có cùng một phút hay không, hoặc liệu họ có cách nhau chưa đầy một phút không? Đối với người đầu tiên, sử dụng:

where RoundToMinute(dateTime1) == RoundToMinute(dateTime2) 

đã tuyên bố:

public static DateTime RoundToMinute(DateTime time) 
{ 
    return new DateTime(time.Year, time.Month, time.Day, 
         time.Hour, time.Minute, 0, time.Kind); 
} 

cho thứ hai, sử dụng:

where Math.Abs((dateTime1 - dateTime2).TotalMinutes) < 1 

Bạn nên cân nhắc những gì bạn muốn kết quả là trong trường hợp đó một là địa phương và một ở UTC, nhân tiện ...

Lưu ý rằng không có gì LINQ cụ thể ở đây - giả sử bạn sử dụng LINQ to Objects. Nếu bạn đang sử dụng LINQ to SQL, thì rõ ràng là bạn không thể sử dụng các phương pháp cục bộ, và chúng ta sẽ phải xem lại ...

EDIT: Tôi vẫn chưa rõ ràng về câu hỏi của bạn. Nếu bạn cần họ để được chính xác cùng ngày/thời gian, thật dễ dàng (để sang một bên có thể địa phương vs vấn đề UTC):

where dateTime1 == dateTime2 

Tuy nhiên, đó đặt ra câu hỏi về việc tại sao bạn đề cập đến "phút chính xác" trong tiêu đề câu hỏi hoặc "sử dụng độ chính xác tối đa một phút" trong phần câu hỏi. .

+0

Jon - Tôi rất thận trọng khi sử dụng RoundToMinute (datetime) vì ngày đến có thể có vài giây và tôi muốn duy trì độ chính xác một phút. Mặc dù Math.abs có thể ném nó ra cũng như tôi đoán? Tôi có thể (nên) dải giây trước khi sử dụng các ngày của khóa học! Nhưng để trả lời câu hỏi của bạn, có tôi cần chúng chính xác như nhau – PreethaA

+1

@Preetha: Nếu bạn cần chúng * chính xác * như nhau, thì bạn cần "độ chính xác phút" theo tiêu đề câu hỏi? –

+0

Trong trường hợp bạn có giá trị datetime đến, nơi bạn không thể chắc chắn có hay không họ có giây kèm theo, nhưng tất cả các bạn quan tâm về nó là cho dù họ là chính xác giống nhau .. xuống đến phút. Tôi đoán phần dải giây nên hoàn toàn tách biệt và trước một so sánh thực tế của các giá trị..so điều này sẽ làm việc trong trường hợp đó. – PreethaA

0

Làm thế nào về

where (Math.Floor(datetime1.Ticks/600000000) == Math.Floor(datetime2.Ticks/600000000)) 

?

+0

chính xác những gì tôi nghĩ khi tôi xem câu hỏi –

+0

'datetime1.Millisecond', điều đó không đúng - giá trị luôn nằm trong khoảng từ 0 đến 999. –

0

Nhờ Allen, sẽ làm điều đó (! Vẫn tìm ra chính xác cách thức quá trình hoạt động) Dưới đây là đoạn mã cho thấy câu trả lời tôi đã đưa ra ban đầu:

(Math.Abs ​​(datetime1.Subtract (datetime2) .TotalMinutes) == 0)

Bối cảnh: Trong mệnh đề WHERE của truy vấn LINQ (do đó một lớp lót), tôi cần kiểm tra xem datetime1 và datetime2 có giống hệt nhau hay không. Các giá trị ngày giờ được xem xét là ngày đóng dấu cho các giá trị khác được sử dụng trong truy vấn.

+0

Như đã chỉnh sửa trong câu trả lời của tôi, chỉ cần sử dụng dateTime1 == dateTime2. Vui lòng cập nhật câu hỏi của bạn để loại bỏ "độ chính xác sử dụng tối đa một phút" vì điều đó không giống với "chính xác như nhau". –

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