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.)

cja
źródło
@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) 
John Woo
źródło
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 .

Jeremy1026
źródło
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'
Todd.J. Hayden
źródło
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
g2server
źródło
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

Rajsanthosh Sreenivasan
źródło
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'

Jamie Marshall
źródło
0

Spróbuj poniżej:

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

-- Convert to string now
SELECT LEFT(CONVERT(VARCHAR, @myDateTime, 120), 10)
Gaurav123
źródło
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