it-swarm.com.de

Prüfen Sie, ob eine Zeit zwischen zwei Zeiten liegt (Zeit-Datentyp)

Ich habe eine Tabelle, die als datetime eine Spalte "Created" enthält.

Ich versuche eine Abfrage, um zu überprüfen, ob die Zeit für den erstellten Wert zwischen zwei Zeiten liegt.

Die erstellte Datumszeit für die erste Zeile lautet '2013-07-01 00: 00: 00.000' (Midnight) und ich versuche, Artikel mit einer Zeit zwischen 23:00 Uhr und 7:00 Uhr abzufragen.

select *
from MyTable
where CAST(Created as time) between '23:00:00' and '06:59:59'

Es werden jedoch keine Ergebnisse zurückgegeben.

Muss ich meine Zeiten in Datumsangaben umwandeln?

10
TrueEddie

Ich vermute, Sie möchten überprüfen, ob es nach 23 Uhr oder vor 7 Uhr ist:

select *
from MyTable
where CAST(Created as time) >= '23:00:00' 
   or CAST(Created as time) < '07:00:00'
32
Jon Skeet
select *
from MyTable
where CAST(Created as time) not between '07:00' and '22:59:59 997'
5
t-clausen.dk

Das sollte auch funktionieren (auch in SQL-Server 2005):

SELECT *
FROM dbo.MyTable
WHERE Created >= DATEADD(hh,23,DATEADD(day, DATEDIFF(day, 0, Created - 1), 0))
  AND Created <  DATEADD(hh,7,DATEADD(day, DATEDIFF(day, 0, Created), 0))

DEMO

1
Rango

Ich hatte ein sehr ähnliches Problem und möchte meine Lösung mitteilen

In Anbetracht dieser Tabelle (alle MySQL 5.6):

create table DailySchedule
(
  id         int auto_increment primary key,
  start_time time not null,
  stop_time  time not null
);

Wählen Sie alle Zeilen aus, für die eine bestimmte Zeit x (hh:mm:ss) zwischen Start- und Stoppzeit liegt. Einschließlich des nächsten Tages.

Hinweis: Ersetzen Sie NOW() durch die jederzeit x, die Sie möchten

SELECT id
FROM DailySchedule
WHERE
  (start_time < stop_time AND NOW() BETWEEN start_time AND stop_time)
  OR
  (stop_time < start_time AND NOW() < start_time AND NOW() < stop_time)
  OR
  (stop_time < start_time AND NOW() > start_time)

Ergebnisse

Gegeben

  id: 1, start_time: 10:00:00, stop_time: 15:00:00
  id: 2, start_time: 22:00:00, stop_time: 12:00:00
  • Ausgewählte Zeilen mit NOW = 09:00:00: 2
  • Ausgewählte Zeilen mit NOW = 14:00:00: 1
  • Ausgewählte Zeilen mit NOW = 11:00:00: 1,2
  • Ausgewählte Zeilen mit NOW = 20:00:00: nichts
1
Manuel

Betrachten wir eine Tabelle, in der die Schichtdetails gespeichert werden 

enter image description here

Bitte überprüfen Sie die SQL-Abfragen, um eine Tabelle zu generieren und den Zeitplan anhand einer Eingabe (Zeit) zu finden.

Deklaration der Tabellenvariablen

declare @MyShiftTable table(MyShift int,StartTime time,EndTime time)

Werte zur Tabellenvariablen hinzufügen

insert into @MyShiftTable select 1,'01:17:40.3530000','02:17:40.3530000'
insert into @MyShiftTable select 2,'09:17:40.3530000','03:17:40.3530000'
insert into @MyShiftTable select 3,'10:17:40.3530000','18:17:40.3530000'

Eine andere Tabellenvariable mit einem zusätzlichen Feld namens "Flag" erstellen

declare @Temp table(MyShift int,StartTime time,EndTime time,Flag int)

Hinzufügen von Werten zur temporären Tabelle durch Vertauschen der Start- und Endzeit  

einfügen in @Temp. Wählen Sie MyShift aus, wenn (StartTime> EndTime) und dann EndTime andernfalls StartTime enden. Wenn (StartTime> EndTime) und StartTime andernfalls EndTime enden

Eingabevariable erstellen, um die Schicht zu finden

declare @time time=convert(time,'10:12:40.3530000')

Abfrage, um die Schicht zu finden, die der gelieferten Zeit entspricht

wählen Sie myShift von @Temp wo 
(@time zwischen StartTime und EndTime und Flag = 0) oder (@time nicht zwischen StartTime und EndTime und Flag = 1) 

0