Frage

Könnten Sie mir hier bitte helfen?

Ich habe eine Spalte mit varchar (5) -Werten wie [hh]: mm zB.7:30, 13:15, 10:45, 9:00 usw.Ich verwende datediff (), um den Zeitunterschied zwischen diesen Werten zu berechnen.Alles läuft glatt, bis ein Wert größer als 23:59 erscheint.Ich habe versucht, die Spalte in Uhrzeit, Datum / Uhrzeit usw. zu konvertieren, aber jedes Mal, wenn ich das gleiche Ergebnis erhalte -> der Wert ist "außerhalb des Bereichs".Ich habe versucht, ohne Glück in Dezimalzahlen umzuwandeln..versuchte dateadd (Stunde, 0, @ Wert)...mir gehen die Ideen aus.Bitte um Rat.

Ich bin auf MS SQL 2012

-UPDATE- tut mir leid Leute, ich habe mich nicht klar über das Problem geäußert.Als ich Zeit sagte, meinte ich Dauer (keine bestimmte Tageszeit).Ich speichere eine Zeit, die für eine Aufgabe aufgewendet wird.Es könnte 1 Stunde sein, aber es können sogar insgesamt 100 Stunden sein (sagen wir mal während eines Monats).In Excel würde ich das Format [hh]: mm iso hh: mm verwenden, um dies zu erhalten.Das [hh]: mm von Excel ist genau das, wonach ich in SQL suche, es aber nicht finden kann.Ist varchar (5) ein geeignetes Format zum Speichern solcher Daten?

War es hilfreich?

Lösung

Um (Nicht-Zeit-) Werte im Format HH: MM zu konvertieren, extrahieren Sie die Stunden, konvertieren Sie sie in Minuten und fügen Sie dann die Minuten hinzu;

cast(left(fld, charindex(':', fld) - 1) as int) * 60 + cast(substring(fld, charindex(':', fld) + 1, len(fld)) as int)

Sie können sie dann direkt vergleichen oder zu einer Datums- / Uhrzeitangabe hinzufügen dateadd mit dem minutes Flagge.

Andere Tipps

Ich denke, der Versuch, Nicht-Zeitwerte in Zeit umzuwandeln und zu erraten, was der Benutzer bei der Eingabe von Daten beabsichtigt hat, kann zu falschen Daten und falschen Ergebnissen führen.

Keine Daten sind besser als falsche Daten.Daher würde ich Werte überprüfen, wenn es sich um einen gültigen Zeitwert handelt, der sich davon unterscheidet, sonst ignoriere ich ihn einfach.

So etwas in der Art.....

Testdaten

Stellen Sie sich vor, Sie haben zwei Spalten StartTime und EndTime beide VARCHAR(5) Datentyp.

Jetzt sind einige der Werte ungültige Zeitwerte

DECLARE @TABLE TABLE (StartTime VARCHAR(5), EndTime VARCHAR(5))

INSERT INTO @TABLE VALUES 
('09:00' , '15:00'),
('10:00' , '17:00'),
('15:00' , '24:30'),     --<-- Invalid Endtime
('25:00' , '15:00')      --<-- Invalid StartTime

Abfrage

Wobei ISDATE() die Funktion nimmt nur die Differenz von Startzeit und Endzeit an, wenn beide gültige Zeitwerte sind, andernfalls ignorieren Sie sie einfach.

ISDATE() gibt 1 zurück, wenn der übergebene Wert gültig ist DATETIME, DATEoder TIME usw. Wert.und 0, wenn es nicht ist.

SELECT CASE 
        WHEN  ISDATE(StartTime) = 1 AND ISDATE(EndTime) = 1
        THEN DATEDIFF(HOUR, StartTime, EndTime)
       END
FROM @TABLE 

Ergebnismenge

╔═════════════════╗
║ Datediff_Result ║
╠═════════════════╣
║ 6               ║
║ 7               ║
║ NULL            ║
║ NULL            ║
╚═════════════════╝
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top