T-SQL'de bir tarih saatini dizeye dönüştürme


91

Bu soruyu burada bulamadığıma şaşırıyorum.

Bir tarih saatim var ve bunu başka bir dizeye ekleyebilmek için bir dizeye dönüştürmek istiyorum. Bunu kolaylıkla bir tarih saatine dönüştürülebilecek bir formatta istiyorum.

Bunu nasıl yapabilirim?

(Tarih bölümünü ve saat bölümünü istiyorum.)


@TonyHopkinson Ben de çok sayıda hit aldım ama hepsi tersine dönüşüyor gibiydi. Ya da daha karmaşık bir şey istemek.
cja

3
Tür Convert, vurgulamak basın Shift + F1 ... savunma her zaman ilk satırına çift tıklayın.
Eric

Yanıtlar:


156

Aşağıdaki sorgu, geçerli tarih saatini alacak ve dizeye dönüştürecektir. aşağıdaki formatta
yyyy-mm-dd hh:mm:ss(24h)

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

49
Doğru formatı elde etmek için rastgele sayılar
geçirmeniz

4
@cja Sürprizini tamamen paylaşıyorum. Tam istediğim biçimi elde etmek için yyddss gibi bir dize sağlamak istiyorum. Muhtemelen bunun teknik veya tarihsel bir nedeni vardır. Ama yine de - çok şaşırtıcı.
Konrad Viltersten

2
Hızlı düzeltme için teşekkürler, ancak cevabınızda ayları dakika olarak kodluyorsunuz, yyyy-AA-gg ss: dd: ss DEĞİL yyyy-aa-gg ss: dd: ss
Tom Martin

Bu eski olmasına rağmen, bu konuya yeni rastladım. Kullanırken DateTimeOffSet, varcharsonucunuzun nasıl görünmesini istediğinize göre uzunluğu ayarladığınızdan emin olun . Benim için saat dilimini istemedim, bu yüzden kullanmak zorunda kaldımSELECT convert(varchar(19), sysdatetimeoffset(), 120)
RoLYroLLs


7

convertBir tarihi dizeye dönüştürmek için Microsoft SQL Server'daki ifadeyi kullanabilirsiniz . Kullanılan sözdizimine bir örnek şöyle olacaktır:

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

Yukarıdakiler, geçerli tarih ve saati YYYY-MM-DD HH:MM:SS24 saatlik saat biçiminde bir dizede döndürür .

İfadenin sonundaki sayıyı, döndürülen dizelerin biçimini değiştirecek birçok taneden birine değiştirebilirsiniz. Bu kodların bir listesi, CAST ve CONVERT referans bölümündeki MSDN'de bulunabilir .


7

Gereksinimimin ne olduğuna ve hangi sürümü kullandığıma bağlı olarak 3 farklı yöntem vardır.

İşte yöntemler ..

1) Dönüştürme Kullanımı

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) Cast Kullanma (SQL Server 2008 ve sonrası)

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) Sabit uzunlukta karakter veri türünü kullanma

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

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

5

Önceki yanıtlardaki CASTve CONVERTişlevlerine ek olarak, SQL Server 2012 ve üstünü kullanıyorsanız, tabanlı bir türü dizeye dönüştürmek için FORMAT işlevini kullanırsınız DATETIME.

Geri dönüştürmek için tersini PARSEveya TRYPARSEişlevleri kullanın .

Biçimlendirme stilleri .NET tabanlıdır (ToString () yönteminin dize biçimlendirme seçeneklerine benzer) ve kültüre duyarlı olma avantajına sahiptir. Örneğin.

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

Sonuçlar:

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

Bir şeyi mi kaçırıyorum yoksa OPs sorunu FORMAT (<tarih var>, 'gg MMMM yyyy HH: mm: ss') veya ihtiyacınız olan özel tarih biçimi ile mi çözüldü ?!
Grim

@Grim bunu da yapabilirsiniz. DokümanlardanThe 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

Aslında burada çok çalıştığını düşünüyorum. SQL Server, DATETIME2 için örtük dize eşdeğerlerine sahiptir. Aslında burada yaptığınız şey örtük dönüştürmeyi kullanmak ve ardından tarih saatini değil sonuç dizesini biçimlendirmektir.
Jamie Marshall

@JamieMarshall aşağı yukarı. MSDN öneriyor: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 - ABD - AA / GG / YYYY

108 - Zaman - SS: MI: SS

112 - Tarih - YYYYAAGG

121 - ODBC - YYYY-AA-GG SS: MI: SS.FFF

20 - ODBC - YYYY-AA-GG SS: MI: SS


1

Bu pek çok kişi tarafından yanıtlandı, ancak en basit çözümün dışarıda bırakıldığını düşünüyorum.

SQL SUNUCUSU (2012+ olduğuna inanıyorum) DATETIME2 için burada gösterildiği gibi örtük dize eşdeğerlerine sahiptir

"Datetime2 için desteklenen dize değişmez biçimleri" bölümüne bakın

OP'lerin sorusuna açıkça cevap vermek için:

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

çıktı:

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

Not: İlk değişken ( myVar) aslında değeri '2019-01-23 12:24:00.0000000'de tutuyor . Yalnızca, Jan 23 2019 12:24PMkullandığınızda çağrılan SQL SUNUCUSU için varsayılan biçimlendirme ayarı nedeniyle biçimlendirilir PRINT. Burada buna takılmayın, gerçek dize (myVer)='2019-01-23 12:24:00.0000000'


0

Aşağıdakileri deneyin:

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

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

1
İyi !! SOLA da yazmamız gerekiyor mu?
Gaurav123

İlk 10 karakteri alır, bu yüzden ihtiyacınız varsa, sadece tarihi istiyorsanız.
ram4nd
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.