Bagaimana cara mengubah DateTime ke VarChar


303

Saya mengerjakan kueri di Sql Server 2005 di mana saya perlu mengubah nilai dalam DateTimevariabel menjadi varcharvariabel dalam yyyy-mm-ddformat (tanpa bagian waktu). Bagaimana aku melakukan itu?


1
CONVERT, lihat dokumentasi MSDN .
Jason Cohen

3
Ketahuilah bahwa YYYY-MM-DD ambigu, tergantung pada pengaturan bahasa Anda. terbaik menggunakan standar ISO YYYYMMDD, lihat posting blog ini
Andy Irving

Jawaban:


262

Dengan Microsoft Sql Server:

--
-- Create test case
--
DECLARE @myDateTime DATETIME
SET @myDateTime = '2008-05-03'

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

12
Bagi Anda yang mungkin tertarik, ini akan lebih baik jika Anda mengubah VARCHAR menjadi CHAR. Lihat posting ini ( stackoverflow.com/questions/59667/… ) untuk lebih jelasnya. Pada dasarnya, ada 2 byte overhead yang terlibat dalam VARCHAR vs CHAR. Dalam skenario ini, kami tahu bahwa string Anda akan selalu 10 karakter, jadi CHAR sesuai.
Will Ediger

1
Catatan tambahan, dari apa yang saya lihat, terlalu buruk tidak ada format yang menghormati apa pun yang DATEFORMAT atur, mungkin ada cara lain.
Alex Nolasco

3
Apakah ada alasan untuk menggunakan LEFT(.., 10)bukan CONVERT(CHAR(10), ...)? Mereka yang bekerja dengan versi SQL Server yang lebih baru dari 2005 (!) Harus memeriksa jawabannya oleh Zar Shardan menyarankan solusi berdasarkan pada FORMAT(date_value, format_string)fungsi.
Nickolay

@Nickolay selain FORMAT()relatif terlalu lambat untukconvert(char(10),...)
abdul qayyum

380

Inilah beberapa sql uji untuk semua gaya.

DECLARE @now datetime
SET @now = GETDATE()
select convert(nvarchar(MAX), @now, 0) as output, 0 as style 
union select convert(nvarchar(MAX), @now, 1), 1
union select convert(nvarchar(MAX), @now, 2), 2
union select convert(nvarchar(MAX), @now, 3), 3
union select convert(nvarchar(MAX), @now, 4), 4
union select convert(nvarchar(MAX), @now, 5), 5
union select convert(nvarchar(MAX), @now, 6), 6
union select convert(nvarchar(MAX), @now, 7), 7
union select convert(nvarchar(MAX), @now, 8), 8
union select convert(nvarchar(MAX), @now, 9), 9
union select convert(nvarchar(MAX), @now, 10), 10
union select convert(nvarchar(MAX), @now, 11), 11
union select convert(nvarchar(MAX), @now, 12), 12
union select convert(nvarchar(MAX), @now, 13), 13
union select convert(nvarchar(MAX), @now, 14), 14
--15 to 19 not valid
union select convert(nvarchar(MAX), @now, 20), 20
union select convert(nvarchar(MAX), @now, 21), 21
union select convert(nvarchar(MAX), @now, 22), 22
union select convert(nvarchar(MAX), @now, 23), 23
union select convert(nvarchar(MAX), @now, 24), 24
union select convert(nvarchar(MAX), @now, 25), 25
--26 to 99 not valid
union select convert(nvarchar(MAX), @now, 100), 100
union select convert(nvarchar(MAX), @now, 101), 101
union select convert(nvarchar(MAX), @now, 102), 102
union select convert(nvarchar(MAX), @now, 103), 103
union select convert(nvarchar(MAX), @now, 104), 104
union select convert(nvarchar(MAX), @now, 105), 105
union select convert(nvarchar(MAX), @now, 106), 106
union select convert(nvarchar(MAX), @now, 107), 107
union select convert(nvarchar(MAX), @now, 108), 108
union select convert(nvarchar(MAX), @now, 109), 109
union select convert(nvarchar(MAX), @now, 110), 110
union select convert(nvarchar(MAX), @now, 111), 111
union select convert(nvarchar(MAX), @now, 112), 112
union select convert(nvarchar(MAX), @now, 113), 113
union select convert(nvarchar(MAX), @now, 114), 114
union select convert(nvarchar(MAX), @now, 120), 120
union select convert(nvarchar(MAX), @now, 121), 121
--122 to 125 not valid
union select convert(nvarchar(MAX), @now, 126), 126
union select convert(nvarchar(MAX), @now, 127), 127
--128, 129 not valid
union select convert(nvarchar(MAX), @now, 130), 130
union select convert(nvarchar(MAX), @now, 131), 131
--132 not valid
order BY style

Inilah hasilnya

output                   style
Apr 28 2014  9:31AM          0
04/28/14                     1
14.04.28                     2
28/04/14                     3
28.04.14                     4
28-04-14                     5
28 Apr 14                    6
Apr 28, 14                   7
09:31:28                     8
Apr 28 2014  9:31:28:580AM   9
04-28-14                     10
14/04/28                     11
140428                       12
28 Apr 2014 09:31:28:580     13
09:31:28:580                 14
2014-04-28 09:31:28          20
2014-04-28 09:31:28.580      21
04/28/14  9:31:28 AM         22
2014-04-28                   23
09:31:28                     24
2014-04-28 09:31:28.580      25
Apr 28 2014  9:31AM          100
04/28/2014                   101
2014.04.28                   102
28/04/2014                   103
28.04.2014                   104
28-04-2014                   105
28 Apr 2014                  106
Apr 28, 2014                 107
09:31:28                     108
Apr 28 2014  9:31:28:580AM   109
04-28-2014                   110
2014/04/28                   111
20140428                     112
28 Apr 2014 09:31:28:580     113
09:31:28:580                 114
2014-04-28 09:31:28          120
2014-04-28 09:31:28.580      121
2014-04-28T09:31:28.580      126
2014-04-28T09:31:28.580      127
28 جمادى الثانية 1435  9:31:28:580AM    130
28/06/1435  9:31:28:580AM    131

Buat nvarchar(max)lebih pendek untuk mengurangi waktu. Sebagai contoh:

select convert(nvarchar(11), GETDATE(), 0)
union select convert(nvarchar(max), GETDATE(), 0)

output:

May 18 2018
May 18 2018  9:57AM

Di sini Terkadang kita ingin suka dd-mmatau jun - 28. Ada pilihan ??
Rock

Berfungsi untuk SQL Server 2005 jadi ini bagus untuk kita yang sayangnya masih campur tangan dengan sistem yang lebih tua. Segera ditingkatkan ke 2014, bersemangat!
dyslexicanaboko

Saya ingin memformat mendekati 101 - 101 = 28/04/2014, saya ingin tanpa nol di bulan, output 4/28/2014, apakah ini berlaku?
ahmed abdelqader

1
Bukankah zona waktu pengidentifikasi Z hilang dalam gaya 127.
Atishay

@Atishay "hanya didukung saat casting dari data karakter ke datetime atau smalldatetime". Lihat catatan kaki 6 dan 7 di docs.microsoft.com/de-de/sql/t-sql/functions/…
Colin



9

Anda bisa menggunakannya DATEPART(DATEPART, VARIABLE). Sebagai contoh:

DECLARE @DAY INT 
DECLARE @MONTH INT
DECLARE @YEAR INT
DECLARE @DATE DATETIME
@DATE = GETDATE()
SELECT @DAY = DATEPART(DAY,@DATE)
SELECT @MONTH = DATEPART(MONTH,@DATE)
SELECT @YEAR = DATEPART(YEAR,@DATE)


6

- Ini memberi Anda waktu sebagai 0 dalam format 'yyyy-mm-dd 00: 00: 00.000'


SELECT CAST( CONVERT(VARCHAR, GETDATE(), 101) AS DATETIME) ; 

5

Dengan Microsoft SQL Server:

Gunakan Sintaks untuk CONVERT:

CONVERT ( data_type [ ( length ) ] , expression [ , style ] )

Contoh:

SELECT CONVERT(varchar,d.dateValue,1-9)

Untuk gaya Anda dapat menemukan info lebih lanjut di sini: MSDN - Cast and Convert (Transact-SQL) .




3
declare @dt datetime

set @dt = getdate()

select convert(char(10),@dt,120) 

Saya memiliki panjang data tetap char(10)seperti yang Anda inginkan format string tertentu.


2

OP menyebutkan format datetime . Bagi saya, bagian waktu menghalangi.
Saya pikir itu sedikit lebih bersih untuk menghapus bagian waktu (dengan casting datetime to date) sebelum memformat.

convert( varchar(10), convert( date, @yourDate ) , 111 )

2

Beginilah cara saya melakukannya: CONVERT(NVARCHAR(10), DATE1, 103) )


2

Anda dapat mengonversi tanggal Anda dalam banyak format, sintaksisnya mudah digunakan:

CONVERT('TheTypeYouWant', 'TheDateToConvert', 'TheCodeForFormating' * )
CONVERT(NVARCHAR(10), DATE_OF_DAY, 103) => 15/09/2016
  • Kode adalah bilangan bulat, di sini 3 adalah pemformatan ketiga tanpa abad, jika Anda ingin abad hanya mengubah kode ke 103.

Dalam kasus Anda , saya baru saja mengonversi dan membatasi ukuran dengan nvarchar (10) seperti ini:

CONVERT(NVARCHAR(10), MY_DATE_TIME, 120) => 2016-09-15

Lihat lebih lanjut di: http://www.w3schools.com/sql/func_convert.asp

Solusi lain (jika teman kencan Anda adalah Datetime) adalah CAST sederhana :

CAST(MY_DATE_TIME as DATE) => 2016-09-15

2

Coba SQL ini:

select REPLACE(CONVERT(VARCHAR(24),GETDATE(),103),'/','_') + '_'+ 
       REPLACE(CONVERT(VARCHAR(24),GETDATE(),114),':','_')

2

Untuk SQL Server 2008+ Anda dapat menggunakan CONVERT dan FORMAT secara bersamaan.

Misalnya, untuk cap waktu gaya Eropa (misalnya Jerman):

CONVERT(VARCHAR, FORMAT(GETDATE(), 'dd.MM.yyyy HH:mm:ss', 'de-DE'))

1

Anda tidak mengatakan basis data mana, tetapi dengan mysql di sini adalah cara mudah untuk mendapatkan tanggal dari cap waktu (dan konversi tipe varchar akan terjadi secara otomatis):

mysql> select date(now());
+-------------+
| date(now()) |
+-------------+
| 2008-09-16  | 
+-------------+
1 row in set (0.00 sec)

1
Periksa lagi: ia menentukan server sql melalui tag.
Joel Coehoorn

1

Cara terpendek dan paling sederhana adalah:

DECLARE @now AS DATETIME = GETDATE()

SELECT CONVERT(VARCHAR, @now, 23)

1
DECLARE @DateTime DATETIME
SET @DateTime = '2018-11-23 10:03:23'
SELECT CONVERT(VARCHAR(100),@DateTime,121 )


0

Tulis fungsi

CREATE FUNCTION dbo.TO_SAP_DATETIME(@input datetime)
RETURNS VARCHAR(14)
AS BEGIN
    DECLARE @ret VARCHAR(14)
    SET @ret = COALESCE(SUBSTRING(REPLACE(REPLACE(REPLACE(CONVERT(VARCHAR(26), @input, 25),'-',''),' ',''),':',''),1,14),'00000000000000');
    RETURN @ret
END

0
select REPLACE(CONVERT(VARCHAR, FORMAT(GETDATE(), N'dd/MM/yyyy hh:mm:ss tt')),'.', '/')

akan memberi 05/05/2020 10:41:05 AMhasilnya


-3

Anda tidak mengatakan bahasa apa tetapi saya berasumsi C#/.NETkarena ini memiliki DateTimetipe data asli . Dalam hal itu, konversikan saja menggunakan ToStringmetode dan gunakan specifier format seperti:

DateTime d = DateTime.Today;
string result = d.ToString("yyyy-MM-dd");

Namun, saya akan berhati-hati agar tidak menggunakan ini dalam permintaan basis data atau digabungkan menjadi pernyataan SQL. Database membutuhkan string pemformatan khusus untuk digunakan. Anda lebih baik menunjukkan bagian waktu dan menggunakan DateTime sebagai parameter SQL jika itu yang ingin Anda capai.


Dalam pertanyaan tersebut, disebutkan "Saya sedang mengerjakan permintaan di Sql Server 2005".
InkHeart

4
@InkHeart dan semua pemilih turun - Jawaban ini diposting pada 2008. Jika Anda memeriksa riwayat pengeditan untuk pertanyaan awal, tidak ada tag dan / atau informasi terkait teknologi lainnya yang disertakan.
GSazheniuk
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.