Bagaimana cara mendapatkan tanggal dalam format YYYY-MM-DD dari bidang datetime TSQL?

259

Bagaimana cara mengambil tanggal dari SQL Server dalam YYYY-MM-DDformat? Saya perlu ini untuk bekerja dengan SQL Server 2000 dan lebih tinggi. Apakah ada cara sederhana untuk melakukan ini di SQL Server atau akan lebih mudah untuk mengubahnya secara terprogram setelah saya mengambil set hasil?

Saya telah membaca CAST dan CONVERT di Microsoft Technet, tetapi format yang saya inginkan tidak tercantum dan mengubah format tanggal bukanlah suatu pilihan.

Kinze
sumber
Deskripsi BOL untuk 126 agak membingungkan (tidak pernah menemukan penjelasan untuk "T").
nojetlag
"T" memisahkan tanggal dari waktu. Lihat ISO 8601 di Wikipedia
krubo

Jawaban:

428
SELECT CONVERT(char(10), GetDate(),126)

Membatasi ukuran potongan varchar dari porsi jam yang tidak Anda inginkan.

Darrel Miller
sumber
3
Tidak, tetapi beberapa klien memiliki masalah dengan panjang tetap.
gbn
54
Posting ini muncul di Google untuk mengonversi ke YYYYMMDD - sehingga yang itu adalah: CONVERT (char (10), GetDate (), 112)
NealWalters
1
Ini tidak berhasil untuk saya, saran di atas dengan kode 112 tidak. Terima kasih @NealWalters
AlexVPerl
4
Daftar kode integer untuk gaya keluaran: msdn.microsoft.com/en-us/library/ms187928.aspx
Ben Fransen
Kode 126 baik untuk tanggal seperti tanggal lahir dalam format YYYY-mm-dd: CONVERT (char (10), pat_dob, 126) sebagai pat_dob
jjwdesign
118
SELECT convert(varchar, getdate(), 100) -- mon dd yyyy hh:mmAM

SELECT convert(varchar, getdate(), 101) -- mm/dd/yyyy – 10/02/2008                  

SELECT convert(varchar, getdate(), 102) -- yyyy.mm.dd – 2008.10.02           

SELECT convert(varchar, getdate(), 103) -- dd/mm/yyyy

SELECT convert(varchar, getdate(), 104) -- dd.mm.yyyy

SELECT convert(varchar, getdate(), 105) -- dd-mm-yyyy

SELECT convert(varchar, getdate(), 106) -- dd mon yyyy

SELECT convert(varchar, getdate(), 107) -- mon dd, yyyy

SELECT convert(varchar, getdate(), 108) -- hh:mm:ss

SELECT convert(varchar, getdate(), 109) -- mon dd yyyy hh:mm:ss:mmmAM (or PM)

SELECT convert(varchar, getdate(), 110) -- mm-dd-yyyy

SELECT convert(varchar, getdate(), 111) -- yyyy/mm/dd

SELECT convert(varchar, getdate(), 112) -- yyyymmdd

SELECT convert(varchar, getdate(), 113) -- dd mon yyyy hh:mm:ss:mmm

SELECT convert(varchar, getdate(), 114) -- hh:mm:ss:mmm(24h)

SELECT convert(varchar, getdate(), 120) -- yyyy-mm-dd hh:mm:ss(24h)

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

SELECT convert(varchar, getdate(), 126) -- yyyy-mm-ddThh:mm:ss.mmm
Imran
sumber
1
cara mendapatkan 'm / d / yyyy' sebagai gantinya 'mm / dd / yyyy'
user_az
Sejauh ini, inilah jawaban yang paling membantu.
Daniel
109

Dimulai dengan SQL Server 2012 (pertanyaan awal untuk tahun 2000):

SELECT FORMAT(GetDate(), 'yyyy-MM-dd')

Ignas Vyšnia
sumber
Ini adalah cara fleksibel waras untuk melakukan tanggal / waktu dalam versi SQL terbaru menggunakan format standar Dotnet. Ingatlah untuk menggunakan MM bulan untuk membedakan dari menit. Semua format waktu tanggal
jim birch
FORMAT berjalan (biasanya) 43 kali lebih lambat dari CONVERT. Saya sangat menyarankan agar Anda tidak pernah (dan saya tidak sering menggunakan kata itu) menggunakan FORMAT.
Jeff Moden
35

Formulir yang Anda cari tercantum dalam dokumentasi buku online.

http://msdn.microsoft.com/en-us/library/aa226054(SQL.80).aspx

Misalnya, coba yang berikut ini:

select convert(varchar,getDate(),120)
select convert(varchar(10),getDate(),120)
John Sansom
sumber
4
Jika Anda menggunakan default, dalam hal ini, Anda mendapatkan nilai waktu - seluruh format untuk format 120 adalah 'yyyy-mm-dd hh: mi: ss'. Dengan secara eksplisit mendeklarasikan panjangnya, itu dipangkas menjadi format yang Anda tentukan dalam catatan awal Anda - 'yyyy-mm-dd'.
DaveE
26

The convertfungsi dengan format specifier 120 akan memberikan format "yyyy-MM-dd HH: mm: ss", sehingga Anda hanya perlu membatasi panjang untuk 10 untuk mendapatkan hanya bagian tanggal:

convert(varchar(10), theDate, 120)

Namun, memformat tanggal umumnya lebih baik dilakukan di lapisan presentasi daripada di database atau lapisan bisnis. Jika Anda mengembalikan tanggal yang diformat dari database, maka kode klien harus menguraikannya ke tanggal lagi jika perlu melakukan perhitungan apa pun di dalamnya.

Contoh dalam C #:

theDate.ToString("yyyy-MM-dd")
Guffa
sumber
1
Mengapa downvote? Jika Anda tidak menjelaskan apa yang Anda pikir salah, itu tidak dapat memperbaiki jawabannya.
Guffa
14

Untuk YYYYMMDD coba

select convert(varchar,getDate(),112)

Saya hanya diuji pada SQLServer2008.

LosManos
sumber
7

Cara lain ...

CONVERT(varchar, DATEPART(yyyy, @datetime)) + '/' + CONVERT(varchar, DATEPART(mm, @datetime)) + '/' + CONVERT(varchar, DATEPART(dd, @datetime)) 
Athadu
sumber
1
Ini akan membuat 1 digit tanggal seperti pada 8/3/2012 jika Anda ingin 2 digit mm / dd, Anda harus meninggalkan pad tanggal. KANAN ('00 '+ CONVERT (varchar, DATEPART (yyyy, @datetime)), 2) misalnya
MindStalker
7

Bagi mereka yang menginginkan bagian waktu juga (saya lakukan), cuplikan berikut dapat membantu

SELECT convert(varchar, getdate(), 120) -- yyyy-mm-dd hh:mm:ss(24h)
SELECT convert(varchar, getdate(), 121) -- yyyy-mm-dd hh:mm:ss.mmm
SELECT convert(varchar, getdate(), 126) -- yyyy-mm-ddThh:mm:ss.mmm
                              --example -- 2008-10-02T10:52:47.513
pengguna2431693
sumber
6
replace(convert(varchar, getdate(), 111), '/','-')

Juga akan melakukan trik tanpa "memotong apa pun".

Rafael Emshoff
sumber
Saya lebih suka versi ini untuk menghindari bug "tahun 9999" yang terkait dengan versi konversi (varchar (10) ...).
Francis Huang
6

Jika seseorang ingin melakukannya sebaliknya dan menemukan ini.

select convert(datetime, '12.09.2014', 104)

Ini mengonversi string dalam format tanggal Jerman ke objek datetime.

Kenapa harus 104? Lihat di sini: http://msdn.microsoft.com/en-us/library/ms187928.aspx

Jenny O'Reilly
sumber
5

Dalam tautan pemeran dan konversi Anda, gunakan gaya 126 dengan demikian:

CONVERT (varchar(10), DTvalue, 126)

Ini memotong waktu. Persyaratan Anda untuk memilikinya dalam yyyy-mm-dd berarti itu harus berupa tipe data string dan datetime.

Terus terang, saya akan melakukannya pada klien kecuali Anda punya alasan kuat untuk tidak melakukannya.

gbn
sumber
4

Jika Anda ingin menggunakannya sebagai tanggal alih-alih varcharsetelahnya, jangan lupa untuk mengubahnya kembali:

select convert(datetime,CONVERT(char(10), GetDate(),126))
Wayne Evans
sumber
bukankah ini akan mengubahnya kembali ke format standar sistem?
Ignas Vyšnia
3

Saya tidak yakin mengapa cara paling sederhana telah diabaikan / dihilangkan dalam jawaban di atas:

SELECT FORMAT(GetDate(),'yyyy-MM-dd');--= 2020-01-02

SELECT FORMAT(GetDate(),'dd MMM yyyy HH:mm:ss');-- = 02 Jan 2020 08:08:08

Saya lebih suka yang kedua karena bahasa apa pun yang Anda gunakan, Anda akan mengerti tanggal berapa itu!

Juga SQL Server selalu 'memahaminya' ketika Anda mengirimkannya ke prosedur penyimpanan Anda, terlepas dari format regional mana yang ditetapkan di komputer - Saya selalu menggunakan tahun penuh (yyyy), nama bulan (MMM) dan format 24 jam (modal HH) selama satu jam dalam pemrograman saya.

Hannington Mambo
sumber
2

SELECT CONVERT(NVARCHAR(20), GETDATE(), 23)

Dmitri Kouminov
sumber
1
mengapa menggunakan NVARCHAR (20)? mungkinkah ada karakter khusus di sana?
KM.
Saya lebih suka menggunakan UNICODE. Mos dari proyek saya internasional ;-)
Dmitri Kouminov
2

Anda juga dapat menggunakan. Ini dengan menggunakan tipe data baru DATE. Mungkin tidak berfungsi di semua versi sebelumnya, tetapi sangat disederhanakan untuk digunakan di versi yang lebih baru.

SELECT CAST(getdate() AS DATE)
SELECT LEFT(CAST(getdate() AS DATE), 7)
Sams
sumber
1

Saya akan menggunakan:

CONVERT(char(10),GETDATE(),126)
KM.
sumber
1
SELECT Code,Description FROM TABLE

-- This will Include only date part of 14th March 2010. Any date with date companents will not be considered.
WHERE ID= 1 AND FromDate >= CONVERT(DATETIME, '2010-02-14', 126) AND ToDate <= DATEADD(dd, 1, CONVERT(DATETIME, '2010-03-14', 126))

-- This will Include the whole day of 14th March 2010
--WHERE ID= 1 AND FromDate >= CONVERT(DATETIME, '2010-02-14', 126) AND ToDate < DATEADD(dd, 1, CONVERT(DATETIME, '2010-03-14', 126))
arun.passioniway
sumber
1

Dari SQL Server 2008 Anda dapat melakukan ini: CONVERT(date,getdate())

Asher
sumber
1

Tampaknya tidak perlu melakukan hal-hal aneh, jika Anda ingin pasangan Anda dipisahkan oleh garis miring. Hanya menghindarinya dengan backslash. Kalau tidak, Anda akan berakhir dengan sebuah titik.

SELECT FORMAT(GETDATE(),'yyyy\/MM');  

Diuji pada SQL Server 2016

pembuat roti
sumber
Anda harus mengujinya untuk kinerja. FORMAT umumnya 43 kali lebih lambat daripada CONVERT yang rumit.
Jeff Moden
0

Menggunakan pernyataan CASE untuk masing-masing fungsi convert / cast selalu berfungsi untuk saya:

Silakan ganti tableXXXXY dengan nama tabel Anda, dan issueDate_dat dengan nama bidang datetime Anda di tabel itu:

SELECT  issueDate_dat, CONVERT(varchar, DATEPART(yyyy, issuedate_dat))  AS issueDateYYYY
, CASE WHEN (len(CONVERT(varchar, DATEPART(mm, issuedate_dat))) < 2) THEN '0' +CONVERT(varchar, DATEPART(mm, issuedate_dat)) ELSE CONVERT(varchar, DATEPART(mm, issuedate_dat)) END AS  issueDateMM
, CASE WHEN (len(CONVERT(varchar, DATEPART(dd, issuedate_dat))) <2) THEN '0' +CONVERT(varchar, DATEPART(dd, issuedate_dat)) ELSE CONVERT(varchar, DATEPART(dd, issuedate_dat)) END AS issueDateDD
FROM            tableXXXXY

Semoga ini bermanfaat. Chagbert.

Chagbert
sumber
0

Solusi ini berfungsi untuk saya, sederhana dan efektif (dengan 126 juga)

CONVERT(NVARCHAR(MAX), CAST(GETDATE() as date), 120)
anfehernandez94
sumber
0

Jika format tanggal sumber Anda kacau, cobalah sesuatu seperti:

select
convert(nvarchar(50),year(a.messedupDate))+'-'+
(case when len(convert(nvarchar(50),month(a.messedupDate)))=1 
    then '0'+ convert(nvarchar(50),month(a.messedupDate))+'-' 
    else convert(nvarchar(50),month(a.messedupDate)) end)+
(case when len(convert(nvarchar(50),day(a.messedupDate)))=1 
    then '0'+ convert(nvarchar(50),day(a.messedupDate))+'-'
    else convert(nvarchar(50),day(a.messedupDate)) end) 
from messytable a
CArnold
sumber
0
 IFormatProvider culture = new System.Globalization.CultureInfo("fr-FR", true);

cmdGetPaymentStatement.Parameters.AddWithValue("@pStartDate", DateTime.Parse("22/12/2017", culture, System.Globalization.DateTimeStyles.AssumeLocal)).IsNullable = true;
Raj Kumar
sumber
Kode di atas digunakan untuk menyediakan prosedur store ke parameter dalam bentuk mm / dd / yyyy
Raj Kumar