TSQL datetime alanından YYYY-AA-GG biçiminde tarih nasıl alınır?


260

SQL Server'dan YYYY-MM-DDbiçimdeki bir tarihi nasıl alabilirim ? SQL Server 2000 ve üstü ile çalışmak için buna ihtiyacım var. Bunu SQL Server'da gerçekleştirmenin basit bir yolu var mı veya sonuç kümesini aldıktan sonra programlı olarak dönüştürmek daha kolay olur mu?

Microsoft Technet'te CAST ve CONVERT'i okudum , ancak istediğim biçim listelenmiyor ve tarih biçimini değiştirmek bir seçenek değil.


126 için BOL açıklaması biraz karışıklıktır ("T" için hiçbir zaman bir açıklama bulamadı).
nojetlag

"T" tarihi zamandan ayırır. Wikipedia'da ISO
8601'i

Yanıtlar:


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

İstemediğiniz saat bölümünün varchar pirzola boyutunu sınırlayın.


3
Hayır, ancak bazı müşterilerin sabit uzunlukla ilgili sorunları var.
gbn

55
Bu yayın Google'da YYYYMMDD'ye dönüştürüldüğü için geliyor - bir tanesi: CONVERT (char (10), GetDate (), 112)
NealWalters

1
Bu benim için işe yaramadı, w / a kodu 112 üzerindeki öneri yaptı. Teşekkürler @NealWalters
AlexVPerl

4
Çıktı stilleri için tamsayı kodlarının listesi: msdn.microsoft.com/en-us/library/ms187928.aspx
Ben Fransen

Kod 126 Böyle YYYY-aa-gg biçiminde bir doğum tarihi gibi tarihlere için iyidir: CONVERT (char (10), pat_dob, 126) pat_dob olarak
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
'm / d / yyyy' yerine 'aa / gg / yyyy' nasıl kullanılır?
user_az

Bu en yararlı cevap.
Daniel

109

SQL Server 2012 ile başlayarak (orijinal soru 2000 içindir):

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


Bu, Dotnet standart formatlarını kullanarak son SQL sürümlerinde tarih / saat yapmanın akılcı esnek yoludur. Dakikalardan ayırmak için MM ayını büyük harfle yazmayı unutmayın. Tüm tarih saat biçimleri
jim birch

FORMAT (genellikle) CONVERT'ten 43 kat daha yavaş çalışır. FORMAT'ı asla kullanmamanızı (ve bu kelimeyi sık kullanmamanızı) şiddetle tavsiye ederim.
Jeff Moden

35

Ardından form çevrimiçi kitaplarda listelenmiştir.

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

Örneğin, aşağıdakileri deneyin:

select convert(varchar,getDate(),120)
select convert(varchar(10),getDate(),120)

4
Varsayılanı alırsanız, bu durumda, zaman değerini alırsınız - biçim 120 için tüm biçim 'yyyy-aa-gg ss: dd: ss' olur. Uzunluğu açıkça bildirerek, orijinal notunuzda belirttiğiniz formata ('yyyy-aa-gg') kesilir.
DaveE

26

convertBiçim belirteci 120 ile fonksiyon size biçim "yyyy-AA-gg HH: dd: ss" verecek, sadece sadece tarih kısmını almak için 10 uzunluğunu sınırlamak zorunda:

convert(varchar(10), theDate, 120)

Ancak, biçimlendirme tarihlerinin genellikle veritabanı veya iş katmanından ziyade sunum katmanında yapılması daha iyidir. Veritabanından biçimlendirilen tarihi döndürürseniz, istemci kodunun, üzerinde herhangi bir hesaplama yapması gerekiyorsa, onu bir tarihe ayrıştırması gerekir.

C # Örneği:

theDate.ToString("yyyy-MM-dd")

1
Neden inişli çıkışlı? Yanlış olduğunu düşündüğünüzü açıklamazsanız, cevabı geliştiremezsiniz.
Guffa

14

YYYYAAGG için deneyin

select convert(varchar,getDate(),112)

Sadece SQLServer2008 üzerinde test yaptım.


7

Başka bir yol ...

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

1
Bu, 8/3/2012'de olduğu gibi 1 haneli tarihler oluşturacaktır. SAĞ ('00 '+ DÖNÜŞÜM (varchar, DATEPART (yyyy, @datetime)), 2) örneğin
MindStalker

7

Zaman parçasını da isteyenler için (yaptım), aşağıdaki snippet yardımcı olabilir

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

Ayrıca "hiçbir şey kesmeden" hile yapacak.


Ben dönüştürmek (varchar (10) ...) sürümü ile ilişkili "yıl 9999" hataları önlemek için bu sürümü tercih ederim.
Francis Huang


5

Yayınlama ve dönüştürme bağlantınızda stil 126'yı kullanın:

CONVERT (varchar(10), DTvalue, 126)

Bu zamanı kısaltır. Yyyy-aa-gg'ye sahip olma gereksiniminiz, bunun bir dize veri türü ve datetime olması gerektiği anlamına gelir.

Açıkçası, bunu yapmak için iyi nedenleriniz yoksa istemcide yaparım.


4

Daha varcharsonra tekrar tarih olarak kullanmak istiyorsanız , geri dönüştürmeyi unutmayın:

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

bu sistem varsayılan biçimine geri dönüştürmek olmaz mı?
Ignas Vyšnia

3

Yukarıdaki cevaplarda en basit yolun neden göz ardı edildiğinden / ihmal edildiğinden emin değilim:

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

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

İkincisini tercih ederim çünkü hangi dili konuşursanız, hangi tarihte olduğunu anlayacaksınız!

Ayrıca SQL Server, bilgisayarlarda hangi bölgesel biçimlerin ayarlandığından bağımsız olarak kaydetme yordamınıza gönderdiğinizde bunu her zaman 'anlar' - Her zaman tam yıl (yyyy), ay adı (MMM) ve 24 saat biçimini (büyük HH) kullanırım Programımda saatlerce.


2

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


1
neden NVARCHAR (20) kullanıyorsunuz? orada özel karakterler olabilir mi?
KM.

UNICODE kullanmayı tercih ediyorum. Projelerimin Mos uluslararası ;-)
Dmitri Kouminov

2

Ayrıca kullanabilirsiniz. Bu yeni veri tipini kullanmaktır DATE. Önceki tüm sürümlerde çalışmayabilir, ancak sonraki sürümlerde kullanmak için büyük ölçüde basitleştirilmiştir.

SELECT CAST(getdate() AS DATE)
SELECT LEFT(CAST(getdate() AS DATE), 7)

1

Kullanmak istiyorum:

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

SQL Server 2008'den bunu yapabilirsiniz: CONVERT(date,getdate())


1

Tarihinizin eğik çizgi ile ayrılmasını istiyorsanız, garip şeyler yapmak gereksiz görünüyor. Sadece ters eğik çizgi ile kaç. Aksi takdirde bir nokta ile sonuçlanacaksınız.

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

SQL Server 2016'da test edildi


Performans için test etmelisiniz. FORMAT genellikle karmaşık bir DÖNÜŞTÜRTEN bile 43 kat daha yavaştır.
Jeff Moden

0

Convert / cast işlevlerinin her biri için bir CASE deyimi kullanmak her zaman benim için çalışır:

Lütfen tableXXXXY yerine tablo adınızı, issueDate_dat öğesini de bu tablodaki datetime alanınızın adıyla değiştirin:

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

Umarım bu yardımcı oldu. chagbert.


0

Bu çözüm benim için basit ve etkili çalışıyor (126 ile)

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

0

Kaynak tarih biçiminiz tamamen dağınıksa, aşağıdaki satırlarda bir şeyler deneyin:

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;

Yukarıdaki kod, aa / gg / yyyy biçiminde parametreye bir mağaza prosedürü sağlamak için kullanılır
Raj Kumar
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.