Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Fehlerbehebung bei Problemen beim Arbeiten mit Datum und Uhrzeit in SQL Server

Die Microsoft SQL Server-Datenbank speichert die Datums- und Uhrzeitinformationen in einer Vielzahl von Formaten. Die häufigsten davon sind DateTime , DatumUhrzeit2 , und Datum . Wie bei allen Arten von Daten können immer wieder Probleme auftreten. In diesem Artikel konzentrieren wir uns auf die Behebung einiger der häufigsten Probleme, die bei der Arbeit mit den SQL-Datentypen „Zeit“ und „Datum“ auftreten können.

Probleme im Zusammenhang mit regional unterschiedlichen Datumsformaten

Das Format der Datumsangaben ist weltweit unterschiedlich. Zum Beispiel schreiben die Briten Datumsangaben im Format tt-mm-jjjj, während die Amerikaner Datumsangaben im Format mm-tt-jjjj schreiben. Auf diese Weise wird dasselbe Datum, der 31. Dezember 2020, im britischen Datumsformat als 31-12-2020 und im amerikanischen Format als 31-12-2020 geschrieben.

Es können Unfähigkeitsprobleme auftreten, wenn Sie das Datum nicht in einem Format angeben, das den Spracheinstellungen Ihrer SQL Server-Instanz entspricht.

Das folgende Skript konvertiert die Textzeichenfolge mit den Datumsinformationen in das DATETIME-Format. Die Spracheinstellungen sind auf BRITISH eingestellt. Die Textzeichenfolge enthält 31-12-2020 04:25:30 .

Wenn Sie diese Zeichenfolge in das DATETIME-Format umwandeln, wird 31 als Tag behandelt, während 12 standardmäßig als Monat gilt. Daher wird die Konvertierung erfolgreich sein, wie aus der Ausgabe ersichtlich:

SET LANGUAGE BRITISH;
DECLARE @date VARCHAR(50) = '31-12-2020 04:25:30';
SELECT CAST(@date AS DATETIME);

Wenn Sie jedoch versuchen, die Zeichenfolge mit dem Datum 31-12-2020 zu konvertieren in das DATETIME-Format mit US_ENGLISH Spracheinstellungen erhalten Sie eine Fehlermeldung wie unten gezeigt:

SET LANGUAGE US_ENGLISH;
DECLARE @date VARCHAR(50) = '31-12-2020 04:25:30';
SELECT CAST(@date AS DATETIME);

Der Fehler tritt auf, weil die US_ENGLISH-Spracheinstellungen 31 definieren als Monat statt als Tag. Als Monat Wert nicht größer als 12 sein kann, erhalten wir den Fehler Wert außerhalb des gültigen Bereichs .

Wenn Sie das Datum als 31.12.2020 angeben und dann die Datumszeichenfolge mithilfe der US_ENGLISH-Einstellungen in DATETIME konvertieren, sehen Sie die erfolgreiche Konvertierung:

SET LANGUAGE US_ENGLISH;
DECLARE @date VARCHAR(50) = '12-31-2020 04:25:30';
SELECT CAST(@date AS DATETIME);

Ebenso die Umstellung des 31.12.2020 Die Datumszeichenfolge unter der Spracheinstellung BRITISH verursacht ebenfalls einen Fehler – 31 wird als Monat behandelt, das kann nicht sein.

SET LANGUAGE BRITISH;
DECLARE @date VARCHAR(50) = '12-31-2020 04:25:30';
SELECT CAST(@date AS DATETIME);

Um Ihr Datum unabhängig von den Spracheinstellungen korrekt umzuwandeln, können Sie den ISO-Standard 8601 für das Datumsformat verwenden. Um diesem Standard zu entsprechen, geben Sie das Datum im Format yyyy-mm-ddThh:mm:ss an .

Beispielsweise wird die Datumszeichenfolge 2020-12-31T04:25:30 erfolgreich in den Datentyp DATETIME unter den Spracheinstellungen BRITISH konvertiert:

SET LANGUAGE BRITISH;
DECLARE @date VARCHAR(50) = '2020-12-31T04:25:30';
SELECT CAST(@date AS DATETIME);

Das folgende Skript zeigt dieselbe Zeichenfolge, die mit den US_ENGLISH-Einstellungen in DATETIME umgewandelt wurde:

SET LANGUAGE US_ENGLISH;
DECLARE @date VARCHAR(50) = '2020-12-31T04:25:30';
SELECT CAST(@date AS DATETIME);

Überlegungen zur Zeitzone

Vielleicht möchten Sie einige SQL Server-Datenbankanwendungen für das globale Publikum entwickeln. Dazu müssen Sie möglicherweise die Zeitzoneninformationen hinzufügen zu den Datums- und Zeitdatentypen.

In SQL Server speichert der Datentyp DATETIMEOFFSET die Datums- und Uhrzeitinformationen zusammen mit dem Zeitzonenoffset. Der Zeitzonenoffset wird als UTC +/- Anzahl der Stunden angegeben.

Das folgende Skript verwendet beispielsweise die Methode SYSDATETIMEOFFSET(), um Datum, Uhrzeit und Offset-Informationen des Systems abzurufen, auf dem Ihre SQL Server-Instanz ausgeführt wird. Die von der Funktion SYSDATETIMEOFFSET() zurückgegebenen Werte werden in der Variablen @dateoffset vom Typ DATETIMEOFFSET gespeichert. Der Wert der @dateoffset-Variablen wird mit der SELECT-Anweisung ausgegeben:

DECLARE @dateoffset DATETIMEOFFSET = SYSDATETIMEOFFSET();
SELECT @dateoffset

Die folgende Ausgabe zeigt das aktuelle Datum und die Uhrzeit sowie den Offset-Wert. In diesem Fall ist es +02:00.

Sie können auch nur den Versatzwert aus der DATETIMEOFFSET-Variablen abrufen. Dazu müssen Sie die Variable vom Typ DATETIMEOFFSET als zweiten Parameterwert an die Funktion DATENAME() übergeben. Der erste Parameter der Methode DATENAME() sollte tzoffset sein .

Das folgende Skript gibt den Teil des Zeitversatzes des aktuellen Systemdatums zurück:

DECLARE @dateoffset DATETIMEOFFSET = SYSDATETIMEOFFSET();
SELECT DATENAME(tzoffset, @dateoffset)

Um eine benutzerdefinierte DATETIMEOFFSET-Variable zu erstellen, geben Sie Werte für die Teile Datum, Uhrzeit und Zeitversatz an. Im folgenden Skript beispielsweise der Wert für das Datum ist 2015-02-22 , der Wert für den Zeitabschnitt ist 23:59:59:999 , und den Zeitversatzwert ist +05:00 .

DECLARE @dateoffset DATETIMEOFFSET = '2015-02-22 23:59:59:999 +05:00';
SELECT @dateoffset

Schließlich können Sie die Zeitversatzinformationen auch mit SWITCHOFFSET() aktualisieren Funktion.

Sie müssen das DATETIMEOFFSET übergeben Geben Sie variable als ersten Parameterwert ein und übergeben Sie den neuen Zeitversatz als zweiten Parameterwert an SWITCHOFFSET Funktion.

Das folgende Skript aktualisiert den Zeitversatzwert für die DATETIMEOFFSET-Variable von +05:00 auf +09:00.

DECLARE @dateoffset DATETIMEOFFSET = '2015-02-22 23:59:59:999 +05:00';
SELECT SWITCHOFFSET(@dateoffset, '+09:00');

Auswahl von Datensätzen mit dem BETWEEN-Operator mit DateTime

Das ZWISCHEN -Operator im SQL-Server filtert die Datensätze zwischen dem ihm übergebenen Wertebereich.

Sie können den BETWEEN-Operator verwenden, um Datensätze zwischen zwei Datumsangaben zurückzugeben. Sie sollten jedoch besonders vorsichtig sein, wenn Sie es zum Filtern von Datensätzen mit Datum verwenden.

Das folgende Skript erstellt beispielsweise ein Dummy-Hostel Datenbank und fügt einen Schüler hinzu Tabelle dazu.

CREATE DATABASE Hostel

USE Hostel
CREATE TABLE Student

(
Id INT PRIMARY KEY IDENTITY(1,1),
Name VARCHAR (50) NOT NULL,
Gender VARCHAR (50),
BirthDate DateTime
)

Das nächste Skript fügt dem Student einige Dummy-Datensätze hinzu Tisch. Das Geburtsdatum Spalte Schüler Tabelle speichert Daten. Aus diesem Skript können Sie ersehen, dass zwei Studenten, Sara und Nik, die gleichen Geburtsdaten haben. Die Geburtszeit ist jedoch unterschiedlich:

INSERT INTO Student
VALUES ('Jack', 'Male', '2017-06-30 16:30:35'),
('Sara', 'Female', '2015-02-22 00:00:00'),
('Elisa', 'Female',  '2020-03-16 22:24:39'),
('Nik', 'Male',  '2015-02-22 09:45:55'),
('Jos', 'Male',  '2015-03-25 11:55:20')

Man könnte meinen, dass der BETWEEN-Operator verwendet werden könnte, um die Aufzeichnungen aller am 22.02.2015 geborenen Schüler abzurufen.

SELECT * FROM Student
WHERE BirthDate BETWEEN '2015-02-22' AND '2015-02-22'

Aber wenn Sie das obige Skript ausführen, werden Sie sehen, dass trotz der Zeit nur ein Datensatz zurückgegeben wird Teil ist ebenfalls enthalten.

Der Grund dafür ist, dass der BETWEEN-Operator standardmäßig den DATETIME-Wert von 2015-02-22 behandelt als 2015-02-22 00:00:00 . Daher suchte der BETWEEN-Operator in der obigen Abfrage nach den Datensätzen mit dem Geburtsdatum Wert zwischen 2015-02-22 00:00:00 und 2015-02-22 00:00:00 .

Um dieses Problem zu lösen, müssen wir den Zeitabschnitt angeben, wenn wir den Operator BETWEEN mit dem Datentyp DATETIME verwenden.

Das folgende Skript gibt alle Datensätze zwischen 2015-02-22 00:00:00 zurück und 2015-02-22 23:59:59:999 . Der Zeitabschnitt für die obere Datumsgrenze ist 23:59:999.

SELECT * FROM Student
WHERE BirthDate BETWEEN '2015-02-22' AND '2015-02-22 23:59:59:999';

In der Ausgabe erhalten wir zwei Datensätze für das Geburtsdatum 2015-02-22 .

Probleme im Zusammenhang mit Datumsbereichen

Der Datentyp DATETIME unterstützt nur die Jahre 1753 bis 9999. Wenn Sie also versuchen, ein Datum mit einem Jahreswert größer als 9999 oder kleiner als 1753 zu speichern, erhalten Sie eine Fehlermeldung.

Das folgende Skript versucht, den 1392-12-31 zu konvertieren Datumszeichenfolge. 1392 ist kleiner als 1753. Daher haben wir den Bereichsüberschreitungsfehler.

DECLARE @date VARCHAR(50) = '1392-12-31 04:25:30';
SELECT CAST(@date AS DATETIME);

Zum Speichern von Jahreswerten kleiner als 1753 , können Sie DATETIME2 verwenden Datentyp. Es speichert Jahreswerte von 0000 bis 9999.

Das folgende Skript konvertiert die Datumszeichenfolge 1392-12-31 erfolgreich in den Datentyp DATETIME2:

DECLARE @date VARCHAR(50) = '1392-12-31 04:25:30';
SELECT CAST(@date AS DATETIME2);

TRY_COVERT für die DateTime-Konvertierung verwenden

Die CONVERT-Funktion in SQL Server konvertiert die Daten von einem Typ in einen anderen. Sie können es zum Konvertieren der Datenformate vom Typ Datum in andere Formate und umgekehrt verwenden. Wenn die Konvertierung jedoch fehlschlägt, gibt die CONVERT-Funktion einen Fehler aus.

Beispielsweise konvertieren wir die Zeichenfolge 2015-31-31 in das DATETIME-Format:

DECLARE @date VARCHAR(50) = '2015-31-13';
SELECT  CONVERT(DATETIME, @date ,105) as DOB_CONV

Wenn Sie möchten, dass anstelle der Fehlermeldung ein NULL-Wert zurückgegeben wird, wenn die Konvertierung fehlschlägt, verwenden Sie TRY_CONVERT Funktion. Diese Methode lässt die Anwendung nicht abstürzen – sie gibt einfach einen NULL-Wert zurück.

DECLARE @date VARCHAR(50) = '2015-31-13';

SELECT  TRY_CONVERT(DATETIME, @date ,105) as DOB_CONV

Schlussfolgerung

Bei der Arbeit mit SQL Server können viele Probleme auftreten, die Ihre Erfahrung beeinträchtigen und die Aufgaben verkomplizieren. Die Kenntnis der häufigsten Probleme ist andererseits die effizienteste Methode, um sie zu verhindern. Aus diesem Grund haben wir diesen Artikel der Behebung solcher Unannehmlichkeiten gewidmet, die während Ihrer Arbeit mit den Informationen zu Datum und Uhrzeit auftreten können.

Beachten Sie auch, dass moderne Tools für die Arbeit mit SQL Server-Datenbanken das Leben von DB-Spezialisten erheblich vereinfachen können. Insbesondere das dbForge Studio für SQL Server bietet die Funktion des visuellen Dateneditors, die beim Umgang mit Datumsangaben angewendet werden kann. Sie können damit die Termine auf benutzerfreundlichste Weise anzeigen und bearbeiten.