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.


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.


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

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


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)

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

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.


7

Cara lain ...

CONVERT(varchar, DATEPART(yyyy, @datetime)) + '/' + CONVERT(varchar, DATEPART(mm, @datetime)) + '/' + CONVERT(varchar, DATEPART(dd, @datetime)) 

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

6
replace(convert(varchar, getdate(), 111), '/','-')

Juga akan melakukan trik tanpa "memotong apa pun".


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


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.


4

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

select convert(datetime,CONVERT(char(10), GetDate(),126))

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.


2

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


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)

1

Saya akan menggunakan:

CONVERT(char(10),GETDATE(),126)

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

1

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


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


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.


0

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

CONVERT(NVARCHAR(MAX), CAST(GETDATE() as date), 120)

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

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;

Kode di atas digunakan untuk menyediakan prosedur store ke parameter dalam bentuk mm / dd / yyyy
Raj Kumar
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.