Discussion:
Abfrage nach Uhrezeit
(zu alt für eine Antwort)
l.juenemann
2009-10-27 21:22:36 UTC
Permalink
Hallo,

ich habe in meiner Datenbank zwei Spalten, eine "Start" und eine
"Ende". Beide als DateTime. Darin stehen Uhrzeiten und das Datum, an
welchem Tag ich die Uhrzeiten eingetragen habe. Das Datum soll dabei
keine Rolle spielen, da ich an jedem Tag nur die Uhrzeiten abfragen
will.

Ein Eintrag sieht so aus: 27.10.2009 11:15:00

Wie kann ich nun abfragen per SQL, ob z. B zwischen Start 10:00 und
Ende 11:00 ein Eintrag schon existiert? Ich bekomme es nicht hin.
Stelle ich die Abfrage so:
select * from project_objects where start > '10:00'
, dann bekomme ich die Einträge angezeigt, mache ich aber folgende
Abfrage:
select * from project_objects where start > '10:00' and ende < '12:30'
, dann bekomme ich garnichts angezeigt, obwohl in dem Zeitraum
Einträge existieren. Was mache ich falsch?

Gruss

Lothar
Olaf Pietsch
2009-10-28 07:03:01 UTC
Permalink
Hallo Lothar,

"l.juenemann" <***@googlemail.com> schrieb im Newsbeitrag news:4e4f602f-9015-421b-8cdc-***@v37g2000prg.googlegroups.com...
<Frage>

ich habe in meiner Datenbank zwei Spalten, eine "Start" und eine
"Ende". Beide als DateTime. Darin stehen Uhrzeiten und das Datum, an
welchem Tag ich die Uhrzeiten eingetragen habe. Das Datum soll dabei
keine Rolle spielen, da ich an jedem Tag nur die Uhrzeiten abfragen
will.

Ein Eintrag sieht so aus: 27.10.2009 11:15:00

Wie kann ich nun abfragen per SQL, ob z. B zwischen Start 10:00 und
Ende 11:00 ein Eintrag schon existiert? Ich bekomme es nicht hin.
Stelle ich die Abfrage so:
select * from project_objects where start > '10:00'
, dann bekomme ich die Einträge angezeigt, mache ich aber folgende
Abfrage:
select * from project_objects where start > '10:00' and ende < '12:30'
, dann bekomme ich garnichts angezeigt, obwohl in dem Zeitraum
Einträge existieren. Was mache ich falsch?
</Frage>

eine Möglichkeit wäre die Nutzung von der Funktion datepart()

Beispiel:

SELECT createdate
FROM sys.syslogins
WHERE
datepart(hour, createdate) >= 16
AND
datepart(minute, createdate) >= 50
--
Gruß Olaf
Ich unterstütze PASS Deutschland e.V. (http://www.sqlpass.de)
Blog (http://www.sqlpass.de/PASSUserBlogs/tabid/178/Default.aspx?BlogID=3)
Regionalgruppe Köln/Bonn/Düsseldorf
(http://www.sqlpass.de/Regionalgruppen/KoelnBonnDuesseldorf/tabid/81/Default.aspx)
Christoph Muthmann
2009-10-28 07:16:10 UTC
Permalink
Post by Olaf Pietsch
Hallo Lothar,
<Frage>
ich habe in meiner Datenbank zwei Spalten, eine "Start" und eine
"Ende". Beide als DateTime. Darin stehen Uhrzeiten und das Datum, an
welchem Tag ich die Uhrzeiten eingetragen habe. Das Datum soll dabei
keine Rolle spielen, da ich an jedem Tag nur die Uhrzeiten abfragen
will.
Ein Eintrag sieht so aus: 27.10.2009 11:15:00
Wie kann ich nun abfragen per SQL, ob z. B zwischen Start 10:00 und
Ende 11:00 ein Eintrag schon existiert? Ich bekomme es nicht hin.
select * from project_objects where start > '10:00'
, dann bekomme ich die Einträge angezeigt, mache ich aber folgende
select * from project_objects where start > '10:00' and ende < '12:30'
, dann bekomme ich garnichts angezeigt, obwohl in dem Zeitraum
Einträge existieren. Was mache ich falsch?
</Frage>
eine Möglichkeit wäre die Nutzung von der Funktion datepart()
SELECT createdate
FROM sys.syslogins
WHERE
datepart(hour, createdate) >= 16
AND
datepart(minute, createdate) >= 50
Hi Olaf,
von 17:00 bis 17:49 hast Du aber verloren, oder? ;-)

Einen schönen Tag noch,
Christoph
--
Microsoft SQL Server MVP
http://www.insidesql.org
Olaf Pietsch
2009-10-28 08:30:16 UTC
Permalink
Hi Christoph,
Post by Christoph Muthmann
von 17:00 bis 17:49 hast Du aber verloren, oder? ;-)
bei mir waren nur Daten um16:00 Uhr drin, recht haste....Danke

und so auf die Schnelle hinzugefügt:
...
OR
datepart(hour, createdate) > 16

(gilt natürlich nur am selben Tag)

aber eigentlich gibt es ja noch datediff(), mit der man die Differenz in
Minuten ausrechnen kann...
--
Gruß Olaf
Ich unterstütze PASS Deutschland e.V. (http://www.sqlpass.de)
Blog (http://www.sqlpass.de/PASSUserBlogs/tabid/178/Default.aspx?BlogID=3)
Regionalgruppe Köln/Bonn/Düsseldorf
(http://www.sqlpass.de/Regionalgruppen/KoelnBonnDuesseldorf/tabid/81/Default.aspx)
Christoph Muthmann
2009-10-28 07:13:03 UTC
Permalink
Post by l.juenemann
Hallo,
ich habe in meiner Datenbank zwei Spalten, eine "Start" und eine
"Ende". Beide als DateTime. Darin stehen Uhrzeiten und das Datum, an
welchem Tag ich die Uhrzeiten eingetragen habe. Das Datum soll dabei
keine Rolle spielen, da ich an jedem Tag nur die Uhrzeiten abfragen
will.
Ein Eintrag sieht so aus: 27.10.2009 11:15:00
Wie kann ich nun abfragen per SQL, ob z. B zwischen Start 10:00 und
Ende 11:00 ein Eintrag schon existiert? Ich bekomme es nicht hin.
select * from project_objects where start > '10:00'
, dann bekomme ich die Einträge angezeigt, mache ich aber folgende
select * from project_objects where start > '10:00' and ende < '12:30'
, dann bekomme ich garnichts angezeigt, obwohl in dem Zeitraum
Einträge existieren. Was mache ich falsch?
Hallo Lothar,
Du mußt zuerst die Zeit aus dem Datetime-Feld extrahieren und kannst dann
vergleichen.
select CONVERT(CHAR(5), CURRENT_TIMESTAMP, 108) AS [Zeit]

Wenn das Datum immer gleich ist, kannst Du auch mit einem festen Datum im
Vergleich arbeiten und dadurch einen Index auf dem Datum-Feld verwenden:
select CURRENT_TIMESTAMP
where CURRENT_TIMESTAMP between '20091028 08:00' and '20091028 10:00'

Du mußt natürlich in meinen Beispielen das CURRENT_TIMESTAMP durch das Feld
in Deiner Tabelle ersetzen.

Frank Kalis hat einiges zum Umgang mit Datum und Zeit veröffentlicht:
http://www.insidesql.org/beitraege/datetime/der-ultimative-guide-fuer-die-datetime-datentypen


Einen schönen Tag noch,
Christoph
--
Microsoft SQL Server MVP
http://www.insidesql.org
Dieter Strassner
2009-10-28 08:59:01 UTC
Permalink
Hallo Lothar,
Post by l.juenemann
Wie kann ich nun abfragen per SQL, ob z. B zwischen Start 10:00 und
Ende 11:00 ein Eintrag schon existiert? Ich bekomme es nicht hin.
select * from project_objects where start > '10:00'
, dann bekomme ich die Einträge angezeigt, mache ich aber folgende
select * from project_objects where start > '10:00' and ende < '12:30'
, dann bekomme ich garnichts angezeigt, obwohl in dem Zeitraum
Einträge existieren. Was mache ich falsch?
Ich selbst arbeite auch sehr viel in meinem Projekt mit Uhrzeiten innerhalb
des gleichen Tages (Resourcenverwaltung zu Räume/Referenten/Geräte). Das
Gefrimmel mit datepart, datediff, CONVERT u.s.w. war mir viel zu aufwändig
und FEHLERTRÄCHTIG (wg. Rundungsdifferenzen zwischen
MS-SQL-Server-Datenformat und VB6-Date-Format. Abfragen auf eine exakte
Uhrzeit war teilweise nicht möglich, da irgenwelche Millisekunden in der
SQL-Uhrzeit auftauchten - ähnliches/gleiches? Problem wie bei Doublewerten,
das die Mantisse begrenzt ist und zwangsweise gerundet werden muß).

Habe mich für solche Fälle so entschieden: Datum als "datetime" (ohne
Uhrzeit, bzw. 00:00:00) und ein Integer-Feld mit nur der Uhrzeit (NULL=
keine Zeit festgelegt, ansonsten 00 - 2359). Sekunden interessieren mich
nicht, deshalb nur Maximalwert 2359.

Abfragen auf die Uhrzeiten laufen damit problemlos, Zeitdifferenzen (in
Minuten/Stunden) lassen sich damit auch berechnen (eben hier ohne den
bequemen "DateDiff").
Verzichte auf das eine oder andere Feature, dafür aber kein Ärger mit "fast
unlesbarer SQL-Syntax" bei teilweise komplizierten Abfragen auf zeitliche
Überschneidungen oder unbelegte Ressourcenzeiten zu einem vorgegebenen
Zeitraum.

Ist aber sicherlich für deinen Fall genau abzuwägen.
--
Viele Grüße

Dieter


Rückfragen bitte nur in die Newsgroup!

EDV-Kommunikation Strassner e.K.
68623 Lampertheim
Internet: www.strassner.biz
Loading...