Jak przekonwertować datę i godzinę na ciąg w T-SQL


91

Dziwię się, że nie mogę już tutaj znaleźć tego pytania.

Mam zmienną datę i godzinę i chcę przekonwertować ją na ciąg, aby móc dołączyć ją do innego ciągu. Chcę, aby był w formacie, który można łatwo przekonwertować z powrotem na datę.

Jak mogę to zrobić?

(Chcę część daty i część czasu.)


@TonyHopkinson Mam też wiele hitów, ale wszystkie wydawały się być konwertowane w drugą stronę. Lub chcąc czegoś bardziej skomplikowanego.
— cja

3
Wpisz Convert, kliknij dwukrotnie, aby podświetlić, naciśnij Shift + F1 ... zawsze pierwsza linia obrony.
— Eric J. Price

Odpowiedzi:


156

Następujące zapytanie pobierze bieżącą datę i godzinę i przekształci je w ciąg. z następującym formatem
yyyy-mm-dd hh:mm:ss(24h)

SELECT convert(varchar(25), getdate(), 120) 

49
Nadal nie mogę zapomnieć o tym, że musisz podać dowolne liczby, aby uzyskać właściwy format
— cja

4
@cja Całkowicie podzielam Twoje zaskoczenie. Chcę podać ciąg, taki jak yyddss, aby uzyskać dokładny format, jaki chcę. Prawdopodobnie jest ku temu techniczny lub historyczny powód. Ale nadal - bardzo zaskakujące irytujące.
— Konrad Viltersten,

2
Dzięki za szybką naprawę, ale w swojej odpowiedzi kodujesz miesiące jako minuty, rrrr-MM-dd gg: mm: ss NIE rrrr-mm-dd gg: mm: ss
— Tom Martin

Chociaż to jest stare, właśnie wpadłem na ten wątek. Podczas używania DateTimeOffSetpamiętaj o dostosowaniu varchardługości do tego, jak chcesz, aby wyglądał wynik. Dla mnie nie chciałem strefy czasowej, więc musiałem użyćSELECT convert(varchar(19), sysdatetimeoffset(), 120)
— RoLYroLLs


7

Możesz użyć convertinstrukcji w Microsoft SQL Server, aby przekonwertować datę na ciąg. Przykład zastosowanej składni to:

SELECT convert(varchar(20), getdate(), 120)

Powyższe zwróci bieżącą datę i godzinę w postaci ciągu o formacie YYYY-MM-DD HH:MM:SS24-godzinnym.

Możesz zmienić liczbę na końcu instrukcji na jedną z wielu, co spowoduje zmianę formatu zwracanych ciągów. Listę tych kodów można znaleźć w witrynie MSDN w sekcji dotyczącej RZUTOWANIA i KONWERTU .


7

Istnieją 3 różne metody w zależności od moich wymagań i używanej wersji.

Oto metody ...

1) Korzystanie z programu Convert

DECLARE @DateTime DATETIME = GETDATE();
--Using Convert
SELECT
    CONVERT(NVARCHAR, @DateTime,120) AS 'myDateTime'
    ,CONVERT(NVARCHAR(10), @DateTime, 120) AS 'myDate'
    ,RIGHT(CONVERT(NVARCHAR, @DateTime, 120),8) AS 'myTime'

2) Korzystanie z Cast (SQL Server 2008 i nowsze)

SELECT
    CAST(@DateTime AS DATETIME2) AS 'myDateTime'
    ,CAST(@DateTime AS DATETIME2(3)) AS 'myDateTimeWithPrecision'
    ,CAST(@DateTime AS DATE) AS 'myDate'
    ,CAST(@DateTime AS TIME) AS 'myTime'
    ,CAST(@DateTime AS TIME(3)) AS 'myTimeWithPrecision'

3) Korzystanie ze znaków o stałej długości

DECLARE @myDateTime NVARCHAR(20) = CONVERT(NVARCHAR, @DateTime, 120);
DECLARE @myDate NVARCHAR(10) = CONVERT(NVARCHAR, @DateTime, 120);

SELECT
    @myDateTime AS 'myDateTime'
    ,@myDate AS 'myDate'

5

Oprócz funkcji CASTi CONVERTopisanych w poprzednich odpowiedziach, jeśli używasz programu SQL Server 2012 i nowszych wersji, możesz użyć funkcji FORMAT, aby przekonwertować DATETIMEtyp oparty na ciąg.

Aby przekonwertować z powrotem, użyj odwrotnego PARSElub TRYPARSEfunkcji.

Style formatowania są oparte na platformie .NET (podobnie jak opcje formatowania ciągów w metodzie ToString ()) i mają tę zaletę, że są świadome kultury. na przykład.

DECLARE @DateTime DATETIME2 = SYSDATETIME();
DECLARE @StringResult1 NVARCHAR(100) = FORMAT(@DateTime, 'g') --without culture
DECLARE @StringResult2 NVARCHAR(100) = FORMAT(@DateTime, 'g', 'en-gb') 
SELECT @DateTime
SELECT @StringResult1, @StringResult2
SELECT PARSE(@StringResult1 AS DATETIME2)
SELECT PARSE(@StringResult2 AS DATETIME2 USING 'en-gb')

Wyniki:

2015-06-17 06:20:09.1320951
6/17/2015 6:20 AM
17/06/2015 06:20
2015-06-17 06:20:00.0000000
2015-06-17 06:20:00.0000000

Czy coś mi brakuje, czy też problem z OP został rozwiązany za pomocą FORMATU (<date var>, 'dd MMMM rrrr HH: mm: ss') lub innego niestandardowego formatu daty, którego potrzebujesz ?!
— Ponury

@ Grim, też możesz to zrobić. Z dokumentacjiThe format argument must contain a valid .NET Framework format string, either as a standard format string (for example, "C" or "D"), or as a pattern of custom characters for dates and numeric values (for example, "MMMM DD, yyyy (dddd)")
— g2server

Myślę, że tak naprawdę tutaj pracujesz zbyt ciężko. SQL Server ma niejawne odpowiedniki ciągów dla DATETIME2. To, co faktycznie robisz, to wykorzystanie niejawnej konwersji, a następnie formatowanie wynikowego ciągu, a nie daty i godziny.
— Jamie Marshall

@JamieMarshall mniej więcej. MSDN sugeruje:Use the FORMAT function for locale-aware formatting of date/time and number values as strings. For general data type conversions, use CAST or CONVERT.
— g2server


1
SELECT CONVERT(varchar, @datetime, 103) --for UK Date format 'DD/MM/YYYY'

101 - USA - MM / DD / RRRR

108 - Czas - HH: MI: SS

112 - Data - RRRRMMDD

121 - ODBC - RRRR-MM-DD HH: MI: SS.FFF

20 - ODBC - RRRR-MM-DD GG: MI: SS


1

Wiele osób odpowiedziało na to pytanie, ale wydaje mi się, że pominięto najprostsze rozwiązanie.

SQL SERVER (wierzę, że 2012+) ma niejawne odpowiedniki ciągów dla DATETIME2, jak pokazano tutaj

Zapoznaj się z sekcją „Obsługiwane formaty literałów ciągu dla datetime2”

Aby jednoznacznie odpowiedzieć na pytanie dotyczące PO:

DECLARE @myVar NCHAR(32)
DECLARE @myDt DATETIME2
SELECT @myVar = @GETDATE()
SELECT @myDt = @myVar
PRINT(@myVar)
PRINT(@myDt)

wynik:

Jan 23 2019 12:24PM             
2019-01-23 12:24:00.0000000

Uwaga: Pierwsza zmienna ( myVar) w rzeczywistości również przechowuje wartość '2019-01-23 12:24:00.0000000'. Po prostu zostaje sformatowany z Jan 23 2019 12:24PMpowodu domyślnego formatowania ustawionego dla usługi SQL SERVER, która jest wywoływana, gdy używasz PRINT. Nie daj się tutaj zwieść, rzeczywisty ciąg w (myVer)='2019-01-23 12:24:00.0000000'


0

Spróbuj poniżej:

DECLARE @myDateTime DATETIME
SET @myDateTime = '2013-02-02'

-- Convert to string now
SELECT LEFT(CONVERT(VARCHAR, @myDateTime, 120), 10)

1
Dobry !! Czy musimy również pisać w LEWO?
— Gaurav123

Zajmuje 10 pierwszych znaków, więc jeśli potrzebujesz, jeśli chcesz tylko datę.
— ram4nd
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.