Cara mengonversi datetime menjadi string di T-SQL

91

Saya terkejut karena tidak dapat menemukan pertanyaan ini di sini.

Saya memiliki tanggal waktu var dan saya ingin mengubahnya menjadi string sehingga saya dapat menambahkannya ke string lain. Saya menginginkannya dalam format yang dapat diubah dengan mudah kembali ke waktu tanggal.

Bagaimana saya bisa melakukan ini?

(Saya ingin bagian tanggal dan bagian waktu.)

cja
sumber
@TonyHopkinson Saya mendapat banyak hit juga, tetapi mereka semua tampaknya mengkonversi ke arah lain. Atau menginginkan sesuatu yang lebih rumit.
cja
3
Ketik Convert, klik dua kali untuk menyorot, tekan Shift + F1 ... selalu menjadi garis pertahanan pertama.
Eric

Jawaban:

156

Kueri berikut akan mendapatkan tanggal waktu saat ini dan mengubahnya menjadi string. dengan format sebagai berikut
yyyy-mm-dd hh:mm:ss(24h)

SELECT convert(varchar(25), getdate(), 120) 
John Woo
sumber
49
Saya masih tidak bisa melupakan fakta bahwa Anda harus memberikan nomor arbitrer untuk mendapatkan format yang tepat
cja
4
@cja Saya sangat membagikan kejutan Anda. Saya ingin memberikan string, seperti yyddss untuk mendapatkan format yang saya inginkan. Mungkin ada alasan teknis atau historis untuk ini. Tapi tetap saja - sangat mengejutkan.
Konrad Viltersten
2
Terima kasih atas perbaikan cepatnya tetapi dalam jawaban Anda, Anda mengkodekan bulan sebagai menit, tttt-BB-hh jj: mm: dd BUKAN tttt-bb-hh jj: mm: dd
Tom Martin
Meskipun ini sudah tua, saya baru saja menemukan utas ini. Saat menggunakan DateTimeOffSet, pastikan untuk menyesuaikan varcharpanjangnya dengan hasil yang Anda inginkan. Bagi saya, saya tidak menginginkan zona waktu jadi saya harus menggunakanSELECT convert(varchar(19), sysdatetimeoffset(), 120)
RoLYroLL
30

Ada banyak cara yang berbeda untuk convertsebuah datetimeke string. Inilah salah satu caranya:

SELECT convert(varchar(25), getdate(), 121)  – yyyy-mm-dd hh:mm:ss.mmm

Lihat Demo

Berikut adalah situs web yang memiliki daftar semua konversi:

Cara memformat tanggal & waktu di SQL Server

Taryn
sumber
7

Anda dapat menggunakan convertpernyataan di Microsoft SQL Server untuk mengonversi tanggal menjadi string. Contoh sintaks yang digunakan adalah:

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

Di atas akan mengembalikan tanggal dan waktu sekarang dalam sebuah string dengan format dalam format YYYY-MM-DD HH:MM:SS24 jam.

Anda dapat mengubah nomor di akhir pernyataan menjadi salah satu dari banyak nomor yang akan mengubah format string yang dikembalikan. Daftar kode ini dapat ditemukan di MSDN di bagian referensi CAST dan CONVERT .

Jeremy 1026
sumber
7

Ada 3 metode berbeda tergantung pada apa yang saya butuhkan dan versi mana yang saya gunakan.

Berikut metodenya ..

1) Menggunakan 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) Menggunakan Cast (SQL Server 2008 dan seterusnya)

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) Menggunakan tipe data karakter panjang tetap

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
sumber
5

Selain fungsi CASTdan CONVERTdi jawaban sebelumnya, jika Anda menggunakan SQL Server 2012 dan di atasnya, Anda menggunakan fungsi FORMAT untuk mengonversi DATETIMEtipe berbasis menjadi string.

Untuk mengonversi kembali, gunakan kebalikan PARSEatau TRYPARSEfungsi.

Gaya pemformatan didasarkan pada .NET (mirip dengan opsi pemformatan string metode ToString ()) dan memiliki keuntungan karena sadar budaya. misalnya.

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

Hasil:

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
sumber
Apakah saya melewatkan sesuatu atau apakah masalah OP diselesaikan dengan FORMAT (<date var>, 'dd MMMM yyyy HH: mm: ss') atau format tanggal khusus apa pun yang Anda butuhkan ?!
Grim
@Grim Anda bisa melakukannya juga. Dari dokumenThe 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
Saya pikir Anda sebenarnya bekerja terlalu keras di sini. SQL Server memiliki persamaan string implisit untuk DATETIME2. Apa yang sebenarnya Anda lakukan di sini adalah memanfaatkan konversi implisit dan kemudian memformat string yang dihasilkan, bukan datetime.
Jamie Marshall
@Jamie kurang lebih. MSDN menyarankan: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 - AS - MM / DD / YYYY

108 - Waktu - HH: MI: SS

112 - Tanggal - YYYYMMDD

121 - ODBC - TTTT-BB-HH JJ: MI: SS.FFF

20 - ODBC - TTTT-BB-HH JJ: MI: SS

Rajsanthosh Sreenivasan
sumber
1

Ini telah dijawab oleh banyak orang, tetapi saya merasa solusi paling sederhana telah ditinggalkan.

SQL SERVER (saya percaya 2012+) memiliki persamaan string implisit untuk DATETIME2 seperti yang ditunjukkan di sini

Lihat bagian "Format literal string yang didukung untuk datetime2"

Untuk menjawab pertanyaan OP secara eksplisit:

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

keluaran:

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

Catatan: Variabel pertama ( myVar) sebenarnya memegang nilai '2019-01-23 12:24:00.0000000'juga. Itu baru saja diformat Jan 23 2019 12:24PMkarena set pemformatan default untuk SQL SERVER yang dipanggil saat Anda menggunakan PRINT. Jangan tersandung di sini karena itu, string sebenarnya di (myVer)='2019-01-23 12:24:00.0000000'

Jamie Marshall
sumber
0

Coba di bawah ini:

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

-- Convert to string now
SELECT LEFT(CONVERT(VARCHAR, @myDateTime, 120), 10)
Gaurav123
sumber
1
Bagus !! Apakah kita perlu menulis KIRI juga?
Gaurav123
Dibutuhkan 10 karakter pertama, jadi jika Anda membutuhkannya jika Anda hanya ingin tanggalnya.
ram4nd