Discussion:
Konvertieren von FLOAT in DATETIME
(zu alt für eine Antwort)
Markus Müller
2004-05-17 08:09:19 UTC
Permalink
Hallo NG,

aus Performancegründen versuche ich nun nicht mehr das
Datum selber zu speichern, sondern den Double-Wert des
Datums. Dazu habe ich schon eine Funktion geschrieben, die
das übernimmt.

CONVERT(FLOAT,GETDATE())

Nun habe ich das Problem, das ich nicht weiß, wie man
diesen DOUBLE-Wert wieder in das Format(dd.mm.jjjj.
hh:mm:ss) zurückbringt.

Kann mir hier jemand helfen? und?
Bringt das überhaupt Vorteile, wenn ich nicht mehr auf das
Datum abfrage sondern auf den entsprechenden Double-Wert?

Gruss
Markus
Martin Richter [MVP]
2004-05-17 09:18:43 UTC
Permalink
Hallo Markus!
Post by Markus Müller
aus Performancegründen versuche ich nun nicht mehr das
Datum selber zu speichern, sondern den Double-Wert des
Datums.
Was sind das für Performace Probleme?
Post by Markus Müller
Dazu habe ich schon eine Funktion geschrieben, die
das übernimmt.
CONVERT(FLOAT,GETDATE())
Nun habe ich das Problem, das ich nicht weiß, wie man
diesen DOUBLE-Wert wieder in das Format(dd.mm.jjjj.
hh:mm:ss) zurückbringt.
Kann mir hier jemand helfen? und?
CONVERT macht dies auch:

SELECT CONVERT(DATETIME,CONVERT(FLOAT,GETDATE())), GetDate()

Aber Achtung! Wie das Beispiel zeigt gibt es Rundungsprobleme!
Post by Markus Müller
Bringt das überhaupt Vorteile, wenn ich nicht mehr auf das
Datum abfrage sondern auf den entsprechenden Double-Wert?
IMHO Nein!
--
Martin Richter [MVP] WWJD
"In C we had to code our own bugs. In C++ we can inherit them."
FAQ : http://www.mpdvc.de
Samples: http://www.codeguru.com http://www.codeproject.com
Hannes Brunner
2004-05-17 09:29:58 UTC
Permalink
Hallo Markus,
Post by Markus Müller
aus Performancegründen versuche ich nun nicht mehr das
Datum selber zu speichern, sondern den Double-Wert des
Datums. Dazu habe ich schon eine Funktion geschrieben, die
das übernimmt.
CONVERT(FLOAT,GETDATE())
Nun habe ich das Problem, das ich nicht weiß, wie man
diesen DOUBLE-Wert wieder in das Format(dd.mm.jjjj.
hh:mm:ss) zurückbringt.
Kann mir hier jemand helfen? und?
Bringt das überhaupt Vorteile, wenn ich nicht mehr auf das
Datum abfrage sondern auf den entsprechenden Double-Wert?
Ich denke nicht. Sinnvoll ist vielmehr, wenn möglich mit smalldatetime
zu arbeiten da dies im Gegensatz zu float (8 Bytes) nur 4 Bytes
benötigt. Um die Abfrage-Performance zu verbessern muss man in erster
Linie über einen geeigneten Index nachdenken und die Abfrage so
ausführen, dass der Index auch Verwendung findet. Also z.B. bei einem
Index auf der Spalte 'Datum' (mit Zeitanteil) anstelle

SELECT ...
FROM tabelle
WHERE Convert(char(8), Datum, 112) = '20040517'

besser

SELECT ...
FROM tabelle
WHERE Datum >= '20040517' AND Datum < '20040518'

HTH
Hannes
Elmar Boye
2004-05-17 09:27:38 UTC
Permalink
Hallo Markus,
Post by Markus Müller
aus Performancegründen versuche ich nun nicht mehr das
Datum selber zu speichern, sondern den Double-Wert des
Datums.
Warum? Ein float benötigt 8 Bytes und ein datetime ebenfalls.
Auf reiner SQL Serverebene tut sich das also überhaupt nichts.
Post by Markus Müller
Dazu habe ich schon eine Funktion geschrieben, die
das übernimmt.
Die machts nochmal langsamer. Grundregel lautet dort eher:
Soweit wie möglich direkt auf die nativen SQL Server
Funktionen zurückgreifen, da die hochoptimiert in C(++)
geschrieben sind und vor allem dem Optimierer bekannt sind.
Dafür eher den einen oder anderen Bandwurm in Kauf nehmen,
wenn Geschwindigkeit eine Rolle spielt.
Post by Markus Müller
CONVERT(FLOAT,GETDATE())
SELECT CONVERT(datetime, CONVERT(float, GETDATE()))

Allerdings sind kleinere Ungenauigketien durch die unterschiedliche
Repräsentation nicht auszuschliessen. Fliesskommazahlen sind nunmal
nicht "genau". Und ein Datetime teilt Datum und Zeit in 2 interne
32-Bit Integer auf, ist insofern präziser.

Also nochmal: Warum?

Gruss
Elmar
Frank Kalis
2004-05-17 09:41:02 UTC
Permalink
http://www.insidesql.de/modules.php?op=modload&name=News&file=article&sid=28

----- Markus Müller wrote: ----

Hallo NG

aus Performancegründen versuche ich nun nicht mehr das
Datum selber zu speichern, sondern den Double-Wert des
Datums. Dazu habe ich schon eine Funktion geschrieben, die
das übernimmt

CONVERT(FLOAT,GETDATE()

Warum hast Du den Eindruck, dass die Performance schlecht ist
Wenn ich Dich richtig verstehe, willst Du keine Datetime Spalten mehr haben, sondern irgendwelche numerischen, oder


Nun habe ich das Problem, das ich nicht weiß, wie man
diesen DOUBLE-Wert wieder in das Format(dd.mm.jjjj.
hh:mm:ss) zurückbringt

declare @a floa
set @a = 38111.25
select cast(@a as datetime

------------------------------------------------------
2004-05-06 06:08:38.40

(1 row(s) affected


Kann mir hier jemand helfen? und
Bringt das überhaupt Vorteile, wenn ich nicht mehr auf das
Datum abfrage sondern auf den entsprechenden Double-Wert

Ich bezweifle, dass Dir das Vorteile bringen wird. Du bist gerade dabei, das Rad erneut zu erfinden! ;-

SQL Server ist nicht Access! Das interne Format eines Datetimes ist nicht Double, sonder BINARY(8)
Beide 4 bytes Teile sind binär darstellbar als Integers. Wenn es nur darum geht, den Zeitanteil zu entfernen, habe ich hier verschiedene Möglichkeiten aufgelistet http://www.insidesql.de/modules.php?op=modload&name=News&file=article&sid=117

Wenn es Dir um die schiere Performance geht, sin
SELECT DATEADD(d,DATEDIFF(d,0,getdate()),0
SELECT CAST(SUBSTRING(CAST(GETDATE() AS BINARY(8)),1,4) + 0x00000000 AS DATETIME
SELECT CAST(CAST(SUBSTRING(CAST(GETDATE() AS binary(8)),1,4) AS INT) A
DATETIME

unschlagbar, da sie diesem *wahren Kern* eines Datetimes sehr nahe kommen
Allerdings ist Performance nicht alles. Weshalb diese beiden Möglichkeite

SELECT CONVERT(DATETIME,CONVERT(CHAR(8),GETDATE(),112)
SELECT CONVERT(CHAR(8),GETDATE(),112

absolut gültig und üblich sind

--Fran
http://www.insidesql.d

Loading...