2016-01-26 12 views
8

Bir DateTime.Now ve bir SQL girişinden iki DateTimes karşılaştırmak çalışıyorum. Sorunu, DB'den döndürülmüş türden dolayı kenelerin biraz kapalı olduğunu görüyorum. Ancak etrafta bir çalışma bulamıyorum.C# TarihSonraki dakikaya kadar olan süre

Bu benim DateTime

DateTime toGrab = DateTime.Now.AddMinutes(10) 
           .AddSeconds(-DateTime.Now.Second)  
           .AddMilliseconds(-DateTime.Now.Millisecond); 

kapmak için Ve benim linq ifade olmasıdır.

cc.DBAppointments.Where(c => c.StartDate == toGrab && c.Approved == 1).ToList(); 

Herhangi bir öneri?

+2

Birden çok kez 'DateTime.Now' çağırıyorsanız, bu size farklı sonuçlar verebilir. –

cevap

6

. Tarihçeyi dakikalara kadar karşılaştırmanız gerekirse, linux-to-entities içindeki kanonik işlevlere erişmek için System.Data.Entity.DbFunctions kullanabilirsiniz. Örneğin bu kullanabilirsiniz:

cc.DBAppointments 
    .Where(c => DbFunctions.DiffMinutes(c.StartDate,DateTime.Now) == 0 && c.Approved == 1) 
    .ToList(); 

gelişmiş sql datetime karşılaştırma erişebilir ve size DateTime.Now saniye/milisaniye ekleyerek hile yapmak gerekmez Bu şekilde. Bu işlev , dakikalar'dan daha küçük olan her şeyi göz ardı eder.

+2

Bu, gözle karşılaşmaktan bile daha saftır, çünkü EF, DateTime.Now'unu t-SQL'in 'SysDateTime()' fonksiyonuna çevirir, bu nedenle karşılaştırma, veritabanının sorguyu çalıştırdığı zamanla tam olarak eşleşir. Teorik olarak, bir istemciden bir 'DateTime' değişkeni, nihayet değerlendirildiği zaman saniyeler içinde olabilir. İstemci ve sunucu saatleri arasındaki farkı (teorik olarak değil) belirtmek. –

+0

Bu dbfunctions hakkında her zaman unuttuğum hile oldu, sadece küçük bir kaynağı düzeltmek System.Data.Entity olduğunu. – SernOne

+0

@SernOne Bunu işaretlediğiniz için teşekkürler, düzenledi –

1

Değişim

DateTime toGrab = DateTime.Now.AddMinutes(10) 
           .AddSeconds(-DateTime.Now.Second) 
           .AddMilliseconds(-DateTime.Now.Millisecond); 

Farklı bir kayda göre

DateTime now = DateTime.Now; 
DateTime toGrab = now.AddMinutes(10) 
        .AddSeconds(-now.Second) 
        .AddMilliseconds(-now.Millisecond); 

için, tam milisaniye için randevu kapmak gerekir herhangi bir neden var mı? Kayıp kayıtlara çok mu eğilimli görünüyor?

Düzenleme Ayrıca

, veritabanınızda, değer 2015-12-10 10:33:48.373 onlar 1 mili saniye arayla rağmen 2015-12-10 10:33:48.374 farklıdır. Daha geniş bir aralık elde etmek istiyorsanız,

+0

Not: Bu, DateTime'da bir milisaniyeden daha fazla ayrıntı olduğu için, size net bir "dakikanın üstü" vermeyeceğini unutmayın. –

4

Yapabilirsiniz DateTime.Now, her seferinde farklı bir değere sahip olan birden çok başvuru yapıyorsunuz. Aşağıdaki daha iyi çalışması gerekir:

var now = DateTime.Now; 
var toGrab = now.Date.AddHours(now.Hour).AddMinutes(now.Minute + 10); 

Not

ki dahası var çünkü saniye ve milisaniye kaldırmaya çalışırken daha iyi çalışacak bir tarihe saatleri ve dakikaları ekleyerek, net bir "dakika top" almak için detayını milisaniye cinsinden DateTime.

1

Sen böyle yapmak anlamına gelir comparisons on TimeSpan nesneleri yapabilirsiniz: c.StartDate eğer Tabii

TimeSpan oneMinute = new TimeSpan(0, 1, 0); 
cc.DBAppointments.Where(c => 
    DateTime.Now.AddMinutes(10).Subtract(c.StartDate) < oneMinute && 
    c.Approved == 1).ToList(); 

gelecekte az 9 den dakikadır, < bir sonucu olacaktır çıkarma - 1 dakika. Hedefinizin 1 dakika içinde olup olmadığından emin değilim. Eğer durum buysa, sen TimeSpan mutlak değeri döndürecektir hangi sizin denkleme .Duration() ekleyebilirsiniz: Ben bunun için Entity Framework kullandığınız varsayılmaktadır gidiyorum

cc.DBAppointments.Where(c => 
    DateTime.Now.AddMinutes(10).Subtract(c.StartDate).Duration() < oneMinute && 
    c.Approved == 1).ToList();