2016-05-30 17 views
2

Ich versuche zu zeigen, offen oder geschlossen Status für den Speicher basierend auf Zeitbereich in der Datenbank gespeichert.Finden Sie, ob die aktuelle Zeit zwischen mehreren Zeitbereichen liegt

Jeder Speicher kann 2 Öffnungszeiten hat

Beispiel:

9.00 Uhr bis bis 11:00 Uhr und von 13.00 bis 22.00

Werken für einzelnes Mal Bereich:

IEnumerable<Timings> timings = allStore.ToList(); // from database 

foreach (var storetime in timings) 
{ 
TimeSpan openSpan = TimeSpan.FromTicks((long)storetime.OpenTime); 

TimeSpan openLocalTime = TimeConversions.UTCTimeToLocalTime(openSpan); 

DateTime openDatetime = DateTime.Today.Add(openLocalTime); 

string openDisplayTime = openDatetime.ToString("hh:mm tt"); 

..... 

TimeSpan closeLocalTime = TimeConversions.UTCTimeToLocalTime(closeSpan); 

if ((now > openLocalTime) && (now < closeLocalTime)) 
{       
//Store is Open   
} 

else 
{ 
//Store is Closed 
} 

} 

Mehrere Bereiche:

Hier ist table Struktur.

Jede Hilfe wäre großartig.

+0

Muss die Lösung in C# sein? IMO wäre es besser, es direkt in SQL zu schreiben, anstatt alle Öffnungszeiten abzurufen. – martin

+0

Ich verstehe Ihren Code nicht. Warum ist 'openLocalTime' eine' Zeitspanne 'und keine 'DateTime' (das gleiche gilt für kurze Zeit). Was ist 'TimeConversions.UTCTimeToLocalTime' und welcher Objekttyp ist' Timings'? – Philippe

+0

@Philippe, ich benutze nur die Ticks wie erwähnt [hier] (http://StackOverflow.com/a/8504020/2218697) Ich habe Ticks in der Datenbank als 'BigInt' gespeichert und 'TimeConversions.UTCTimeToLocalTime' wird verwendet, um zu konvertieren UTC tickt auf lokale Zeitspanne, Timings ist eine Liste der Timings für jedes Geschäft, ich habe den Beitrag aktualisiert. Ich hoffe, das hilft. – stom

Antwort

0

Ja, Sie können Any verwenden, da Sie nur die aktuelle Zeit benötigen, um innerhalb eines offenen Bereichs zu sein einmal.

Wie @martin vorgeschlagen hat, könnte die Ausführung dieser Abfrage in der Datenbank eine bessere Lösung sein. Ich weiß nicht, wie Ihre Datenbank aussieht, aber die Abfrage würde etwa so aussehen:

bool isOpen = db.Stores 
    .Single(s => s.Id = whatever) 
    .OpeningHours.Any(d => (now >= d.OpenTime) && (now <= d.CloseTime)); 
+0

Danke für die Antwort, ich habe Ticks in der Datenbank als 'BigInt' gespeichert, bekomme ich diesen Fehler, wenn ich Ihre erste Methode verwenden: 'Operator '> =' kann nicht auf Operanden vom Typ 'System.TimeSpan' und 'lang?' "Ich habe den Beitrag aktualisiert. – stom

+0

Dann sollten Sie jetzt in eine DateTime konvertieren (hat einen Konstruktor oder eine statische Methode, die Ticks, glaube ich) und nur den Teil Zeit zu vergleichen. Wenn die Öffnungszeiten nicht über Mitternacht sein können, wäre das ein bisschen komplizierter. –