Ich versuche, ein Datum mit einzelnen Teilen wie 12, 1, 2007 in eine Datums- / Uhrzeitangabe in SQL Server 2005 zu konvertieren. Ich habe Folgendes versucht:
CAST(DATEPART(year, DATE)+'-'+ DATEPART(month, DATE) +'-'+ DATEPART(day, DATE) AS DATETIME)
Dies führt jedoch zu einem falschen Datum. Was ist der richtige Weg, um die drei Datumswerte in ein geeignetes Datum / Uhrzeit-Format umzuwandeln?
sql
sql-server
sql-server-2005
tsql
Brandon
quelle
quelle
Antworten:
Angenommen,
y, m, d
alle sindint
, wie wäre es mit:Weitere Informationen finden Sie in meiner anderen Antwort für SQL Server 2012 und höher
quelle
yyyymmdd
Format funktioniert unabhängig von diesen Einstellungen. "Eine sechs- oder achtstellige Zeichenfolge wird immer als ymd interpretiert ." docs.microsoft.com/en-us/sql/t-sql/data-types/… Siehe diese Antwort: stackoverflow.com/a/46064419/2266979Versuche dies:
Es funktioniert auch, hat den zusätzlichen Vorteil, dass keine Zeichenfolgenkonvertierungen durchgeführt werden. Es ist also eine reine arithmetische Verarbeitung (sehr schnell) und hängt nicht von einem Datumsformat ab. Dies nutzt die Tatsache, dass die interne Darstellung von SQL Server für datetime- und smalldatetime-Werte zwei ist Teilewert, dessen erster Teil eine Ganzzahl ist, die die Anzahl der Tage seit dem 1. Januar 1900 darstellt, und deren zweiter Teil ein Dezimalbruch ist, der den Bruchteil eines Tages (für die Zeit) darstellt --- Also der ganzzahlige Wert 0 (Null) ) übersetzt immer direkt in den Mitternachtsmorgen des 1. Januar 1900 ...
oder dank des Vorschlags von @brinary
Bearbeitet im Oktober 2014. Wie von @cade Roux erwähnt, verfügt SQL 2012 jetzt über eine integrierte Funktion:
DATEFROMPARTS(year, month, day)
Das gleiche.
Bearbeitet am 3. Oktober 2016 (Dank an @bambams für das Erkennen und @brinary für das Beheben), Die letzte von @brinary vorgeschlagene Lösung. scheint für Schaltjahre nicht zu funktionieren, es sei denn, die Addition von Jahren wird zuerst durchgeführt
quelle
@Year = 2001
,@Month = 13
und@DayOfMonth = 32
in den Ergebnissen2002-02-01T00:00:00.000
. Die akzeptierte Antwort (von Cade Roux) erzeugt einen Fehler, der nützlicher ist.SQL Server 2012 verfügt über eine wunderbare und lang erwartete neue DATEFROMPARTS-Funktion (die bei ungültigem Datum einen Fehler auslöst - mein Hauptargument gegen eine DATEADD-basierte Lösung für dieses Problem):
http://msdn.microsoft.com/en-us/library/hh213228.aspx
oder
quelle
Oder verwenden Sie nur eine einzige dateadd-Funktion:
quelle
SQL Server 2012 verfügt über eine Funktion, die das Datum basierend auf den Teilen erstellt ( DATEFROMPARTS ). Für den Rest von uns ist hier eine Datenbankfunktion, die ich erstellt habe und die das Datum aus den Teilen bestimmt (danke @Charles) ...
Sie können es so nennen ...
Kehrt zurück...
quelle
Versuchen Sie CONVERT anstelle von CAST.
CONVERT ermöglicht einen dritten Parameter, der das Datumsformat angibt.
Eine Liste der Formate finden Sie hier: http://msdn.microsoft.com/en-us/library/ms187928.aspx
Aktualisieren, nachdem eine andere Antwort als "richtige" Antwort ausgewählt wurde:
Ich verstehe nicht wirklich, warum eine Antwort ausgewählt wird, die eindeutig von den NLS-Einstellungen auf Ihrem Server abhängt, ohne auf diese Einschränkung hinzuweisen.
quelle
Sie können auch verwenden
Funktioniert in SQL seit Version 2012 und AzureSQL
quelle
Es ist sicherer und ordentlicher, einen expliziten Ausgangspunkt '19000101' zu verwenden.
quelle
declare @output datetime2 = 0
und statt@Year - 1900
verwenden@Year - DATEPART(year,0);
? Dies funktioniert ohne Umwandlungen in SQL Server 2008 und viel klarer.Wenn Sie keine Zeichenfolgen fernhalten möchten, funktioniert dies ebenfalls (fügen Sie es in eine Funktion ein):
quelle
Ich füge eine einzeilige Lösung hinzu, wenn Sie eine Datums- / Uhrzeitangabe für Datums- und Zeitangaben benötigen :
quelle
Versuchen
quelle
Für SQL Server-Versionen unter 12 kann ich die Verwendung
CAST
in Kombination mit empfehlenSET DATEFORMAT
Wie Sie diese Zeichenfolgen erstellen, liegt bei Ihnen
quelle
Versuchen Sie diese Abfrage:
Ergebnis:
quelle
Ich weiß, dass das OP nach einer SQL 2005-Antwort fragt, aber die Frage ist ziemlich alt. Wenn Sie SQL 2012 oder höher ausführen, können Sie Folgendes verwenden:
Referenz: https://docs.microsoft.com/en-us/sql/t-sql/functions/eomonth-transact-sql?view=sql-server-2017&viewFallbackFrom=sql-server-previousversions
quelle
Ich persönlich bevorzuge Teilzeichenfolgen, da sie Reinigungsoptionen und die Möglichkeit bieten, die Zeichenfolge nach Bedarf zu teilen. Die Annahme ist, dass die Daten das Format 'TT, MM, JJJJ' haben.
Hier ist eine Demonstration, wie es verklagt werden kann, wenn die Daten in einer Spalte gespeichert sind. Es ist unnötig zu erwähnen, dass es ideal ist, die Ergebnismenge zu überprüfen, bevor Sie sie auf die Spalte anwenden
quelle