Ibland när man arbetar med databaser och andra programmeringsmiljöer får man ett datumvärde men det är i fel format/datatyp. Till exempel, om ett datum har genererats med en inbyggd datumfunktion, kan det innehålla både datum och tid, ända ner till sista nanosekund. Och allt du vill ha är dagen, månaden och året, säg så här:2018-01-01.
Om detta händer medan du använder SQL Server kan du använda CONVERT()
funktion för att konvertera den till en annan datatyp. När du gör detta kommer datatypen att avgöra vilket format den visas som.
Den här artikeln ger exempel på hur du använder CONVERT()
funktion i SQL Server för att konvertera ett datumvärde till en annan (datum) datatyp.
Syntax
Först, så här går den officiella syntaxen till:
CONVERT ( data_type [ ( length ) ] , expression [ , style ] )
Dessa argument definieras enligt följande:
expression
- Alla giltiga uttryck.
data_type
- Måldatatypen. Detta inkluderar xml , stor och sql_variant . Alias datatyper kan inte användas.
length
- Ett valfritt heltal som anger längden på måldatatypen. Standardvärdet är
30
. style
- Ett heltalsuttryck som anger hur
CONVERT()
funktion kommer att översätta uttryck . För stilvärdet NULL returneras NULL. data_type bestämmer intervallet.
Exempel 1 – Konvertera från SYSDATETIME() till datatyp
I det här exemplet genererar vi aktuellt datum/tid med SYSDATETIME()
funktion och konvertera det till ett datum datatyp.
Observera att SYSDATETIME()
genererar sitt värde som en datetime2(7) datatyp, så vi konverterar den från den datatypen till en annan datatyp.
SELECT SYSDATETIME() AS Original, CONVERT(date, SYSDATETIME()) AS Converted;
Resultat:
+-----------------------------+-------------+ | Original | Converted | |-----------------------------+-------------| | 2018-06-06 22:53:47.2318751 | 2018-06-06 | +-----------------------------+-------------+
Exempel 2 – Konvertera från SYSDATETIME() till smalldatetime-datatyp
I det här exemplet konverterar vi datumet till en smalldatetime datatyp.
SELECT SYSDATETIME() AS Original, CONVERT(smalldatetime, SYSDATETIME()) AS Converted;
Resultat:
+-----------------------------+---------------------+ | Original | Converted | |-----------------------------+---------------------| | 2018-06-06 22:56:51.6873250 | 2018-06-06 22:57:00 | +-----------------------------+---------------------+
Exempel 3 – Konvertera från SYSDATETIME() till datetimeoffset datatyp
I det här exemplet konverterar vi datumet till en datetimeoffset datatyp.
SELECT SYSDATETIME() AS Original, CONVERT(datetimeoffset, SYSDATETIME()) AS Converted;
Resultat:
+-----------------------------+------------------------------------+ | Original | Converted | |-----------------------------+------------------------------------| | 2018-06-07 09:17:15.2410693 | 2018-06-07 09:17:15.2410693 +00:00 | +-----------------------------+------------------------------------+
Exempel 4 – Konvertera från SYSDATETIME() till tidsdatatyp
Du är inte begränsad till att visa värdets datumkomponent. Du kan också konvertera den till en tid datatyp, så att endast tidskomponenten returneras. Så här:
SELECT SYSDATETIME() AS Original, CONVERT(time, SYSDATETIME()) AS Converted;
Resultat:
+-----------------------------+------------------+ | Original | Converted | |-----------------------------+------------------| | 2018-06-06 23:01:41.7070775 | 23:01:41.7070775 | +-----------------------------+------------------+
Exempel 5 – Konvertera från SYSDATETIMEOFFSET()
De tidigare exemplen använder alla samma inbyggda funktion för att generera datum/tid-värdet, men det behöver naturligtvis inte genereras av denna funktion. Här är ett exempel med SYSDATETIMEOFFSET()
:
SELECT SYSDATETIMEOFFSET() AS Original, CONVERT(date, SYSDATETIMEOFFSET()) AS Converted;
Resultat:
+------------------------------------+----------------------+ | Original | Converted | |------------------------------------+----------------------| | 2018-06-07 09:12:27.3660685 +10:00 | 2018-06-07 | +------------------------------------+----------------------+
Exempel 6 – Konvertera från en databasfråga
Här är ett exempel på att konvertera datumet som har hämtats från en kolumn i WideWorldImporters exempeldatabas:
USE WideWorldImporters; SELECT DISTINCT TOP 10 LastEditedWhen, CONVERT(date, LastEditedWhen) AS 'Converted' FROM Sales.CustomerTransactions;
Resultat:
+-----------------------------+-------------+ | LastEditedWhen | Converted | |-----------------------------+-------------| | 2013-01-02 11:30:00.0000000 | 2013-01-02 | | 2013-01-03 11:30:00.0000000 | 2013-01-03 | | 2013-01-04 11:30:00.0000000 | 2013-01-04 | | 2013-01-05 11:30:00.0000000 | 2013-01-05 | | 2013-01-06 11:30:00.0000000 | 2013-01-06 | | 2013-01-08 11:30:00.0000000 | 2013-01-08 | | 2013-01-09 11:30:00.0000000 | 2013-01-09 | | 2013-01-10 11:30:00.0000000 | 2013-01-10 | | 2013-01-11 11:30:00.0000000 | 2013-01-11 | | 2013-01-12 11:30:00.0000000 | 2013-01-12 | +-----------------------------+-------------+
Observera att du inte är begränsad till att bara konvertera mellan två olika datumformat. Om du till exempel har ett datum lagrat som en sträng kan du också använda CONVERT()
att konvertera från en sträng till ett datum, såväl som alla andra datatyper som du kan behöva konvertera till.
Jag har också skrivit ett inlägg som visar hur man konverterar mellan datumformat med CAST()
funktion med samma exempel som ovan.