2010-12-28 12 views
4

Ich möchte in einem DateTime-Feld nicht nur nach einem Datumsbereich, sondern auch nach einem Zeitbereich suchen können. Zum Beispiel: "Hol mir alle Datensätze im Monat Mai, die zwischen 13 und 15 Uhr erstellt wurden". Die SQL Ich bin auf der Suche generiert ist:Verwenden Sie Linq zu SQL, um nur Zeitabschnitte eines Datums in SQL 2008 zu suchen

WHERE CreatedOn BETWEEN '05/01/2010' AND '06/01/2010' AND CONVERT(time(4), CreatedOn) BETWEEN '01:00 PM' AND '03:00 PM' 

Ich kann nicht scheinen, um herauszufinden, wie man einen Lambda-Ausdruck, um mich dorthin zu gelangen. Hat jemand eine Ahnung? Ich habe System.Linq.Dynamic in meinem Projekt. Ähnlich wie Sie eine Zeichenfolge als OrderBy-Klausel übergeben kann, dachte ich, ich könnte in der Lage sein, das gleiche mit dem Wo-Methode zu tun, wie folgt ::

results = results.Where("CONVERT(time(4), OccurredOn) BETWEEN '{0}' AND '{1}'", Criteria.OffenseTimeStart, Criteria.OffenseTimeEnd); 

Aber das löst eine Ausnahme in System.Linq.Dynamic . Hat jemand irgendwelche Hinweise?

DANKE FÜR DIE HILFE! Hier ist mein Arbeitscode-Auszug. Ich ausgesetzt meine Zeit Kriterien Eigenschaften wie Timespans:

  if (Criteria.OffenseDateStart.HasValue) 
       results = results.Where(o => o.OccurredOn >= Criteria.OffenseDateStart); 

      if (Criteria.OffenseDateEnd.HasValue) 
       results = results.Where(o => o.OccurredOn <= Criteria.OffenseDateEnd); 

      if (Criteria.OffenseTimeStart.HasValue) 
       results = results.Where(o => o.OccurredOn.TimeOfDay >= Criteria.OffenseTimeStart); 

      if (Criteria.OffenseTimeEnd.HasValue) 
       results = results.Where(o => o.OccurredOn.TimeOfDay <= Criteria.OffenseTimeEnd); 

Antwort

2

Ich glaube nicht, dass Sie ein ‚Zwischen‘ tun können, aber Sie können eine Linq-Abfrage wie schreiben:

where (x.CreatedOn.Date >= myDate.Date && x.CreatedOn.Date <= myDate2.Date) 
    && (x.CreatedOn.TimeOfDay >= TimeSpan.Parse("13:00") && x.CreatedOn.TimeOfDay <= TimeSpan.Parse("15:00")) 
+0

Die erzeugte SQL etwas ausführlicher, aber wirkt wie ein Zauber! Ich dachte nicht, dass es eine TimeSpan SQL-Übersetzung gibt ... aber ich glaube ich lag falsch. Vielen Dank! –

+0

Ich denke, was in NHibernate 3.0 produziert wird, ist schöner, aber zumindest funktioniert es :) froh, zu helfen. – Phill

0

So etwas wie das?

results = results.Where(x => x.OccurredOn.Date >= Criteria.OffenseDateStart.Date 
     && x.OccurredOn.Date <= Criteria.OffenseDateEnd.Date 
     && x.OccurredOn.TimeOfDay >= Criteria.OffenseTimeStart.TimeOfDay 
     && x.OccurredOn.TimeOfDay <= Criteria.OffenseTimeEnd.TimeOfDay); 

(Unter der Annahme, dass OccurredOn, OffenseDateStart, OffenseDateEnd, OffenseTimeStart und OffenseTimeEnd alle als DateTime eingegeben werden.)