DateTime'i VarChar'a dönüştürme


303

Sql Server 2005'te (zaman bölümü olmadan) biçiminde DateTimebir varchardeğişken değişkeni dönüştürmek gerekiyor bir sorgu üzerinde çalışıyorum yyyy-mm-dd. Bunu nasıl yaparım?


1
CONVERT, MSDN belgelerine bakın .
Jason Cohen

3
dil ayarlarınıza bağlı olarak YYYY-AA-GG'nin belirsiz olduğunu unutmayın. ISO standardı YYYYMMDD'yi kullanmak için en iyisi, bu blog yayınına bakın
Andy Irving

Yanıtlar:


262

Microsoft Sql Server ile:

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

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

12
İlgilenebilecek olanlar için, VARCHAR'ı CHAR olarak değiştirirseniz bu daha iyi performans gösterir. Daha fazla ayrıntı için bu gönderiye ( stackoverflow.com/questions/59667/… ) bakın. Esasen, VARCHAR'a karşı CHAR'da 2 baytlık ek yük vardır. Bu senaryoda, dizenizin her zaman 10 karakter olacağını biliyoruz, bu nedenle CHAR uygundur.
Ediger

1
Yan not, gördüğüm kadarıyla, çok kötü DATEFORMAT'ın ayarlanmış olduğu formatların hiçbirini onurlandırmaz, belki başka bir yol vardır.
Alex Nolasco

3
LEFT(.., 10)Bunun yerine kullanmak için herhangi bir neden var mı CONVERT(CHAR(10), ...)? Ayrıca 2005'ten daha yeni SQL Server sürümleriyle (!) Çalışanlar, Zar Shardan'ınFORMAT(date_value, format_string) işleve dayalı bir çözüm önerdiği cevabını kontrol etmelidir .
Nickolay

@Nickolay besides FORMAT()is very slow relativeconvert(char(10),...)
abdul qayyum

380

İşte tüm stiller için bazı test sql.

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

İşte sonuç

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

nvarchar(max)Zamanı kısaltmak için daha kısa yapın . Örneğin:

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

çıktılar:

May 18 2018
May 18 2018  9:57AM

Burada Bazen isteriz dd-mmveya jun - 28. Herhangi bir seçenek var mı ??
Rock

SQL Server 2005 için çalışıyor, bu yüzden hala maalesef eski sistemlerle uğraşanlar için harika. Yakında 2014'e yükseltme, heyecanlı!
dyslexicanaboko

101 - 101 = 04/28/2014'e yakın format istiyorum, ayda sıfır olmadan istiyorum, çıktı 4/28/2014, uygulanabilir mi?
ahmed abdelqader

1
Zaman

@Atishay "yalnızca karakter verilerinden datetime veya smalldatetime'a aktarılırken desteklenir". Docs.microsoft.com/de-de/sql/t-sql/functions/…
Colin



9

Kullanabilirsiniz DATEPART(DATEPART, VARIABLE). Örneğin:

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

- Bu size zamanı 'yyyy-aa-gg 00: 00: 00.000' biçiminde 0 olarak verir


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

5

Microsoft SQL Server ile:

CONVERT için Sözdizimi kullanın:

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

Misal:

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

Stil için burada daha fazla bilgi bulabilirsiniz: MSDN - Cast and Convert (Transact-SQL) .




3
declare @dt datetime

set @dt = getdate()

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

char(10)Belirli bir dize biçimi istediğiniz gibi sabit veri uzunluğu var .


2

OP tarih-saat biçiminden bahsetti . Benim için, zaman parçası ön plana çıkıyor.
Ben biçimlendirmeden önce (bugüne kadar datetime döküm) zaman bölümünü kaldırmak için biraz daha temiz olduğunu düşünüyorum.

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

2

Bunu nasıl yaparım: CONVERT(NVARCHAR(10), DATE1, 103) )


2

Tarihinizi birçok formatta dönüştürebilirsiniz, sözdiziminin kullanımı basittir:

CONVERT('TheTypeYouWant', 'TheDateToConvert', 'TheCodeForFormating' * )
CONVERT(NVARCHAR(10), DATE_OF_DAY, 103) => 15/09/2016
  • Kod bir tamsayıdır, burada 3 yüzyıl olmadan üçüncü biçimlendir, eğer yüzyıl istiyorsanız kodu 103 olarak değiştirin.

Senin durumunda , ben sadece dönüştürdüm ve nvarchar (10) ile boyutu kısıtlamak gibi:

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

Daha fazla bilgi için: http://www.w3schools.com/sql/func_convert.asp

Başka bir çözüm (tarihiniz bir Tarihse) basit bir CAST'dir :

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

2

Bu SQL'i deneyin:

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

2

SQL Server 2008+ için CONVERT ve FORMAT öğelerini birlikte kullanabilirsiniz.

Örneğin, Avrupa tarzı (örneğin Almanya) zaman damgası için:

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

1

Hangi veritabanını söylemediniz, ancak burada mysql ile bir zaman damgasından bir tarih almanın kolay bir yoludur (ve varchar türü dönüşümü otomatik olarak gerçekleşmelidir):

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

1
Tekrar kontrol edin: sql sunucusunu bir etiketle belirtti.
Joel Coehoorn

1

En kısa ve en basit yol:

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

Bir işlev yazma

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

05/05/2020 10:41:05 AMsonuç olarak verecek


-3

Hangi dili söylemiyorsunuz ama C#/.NETyerel bir DateTimeveri türü olduğu için varsayıyorum . Bu durumda, ToStringyöntemi kullanarak dönüştürün ve aşağıdaki gibi bir biçim belirteci kullanın:

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

Ancak, bu bir veritabanı sorgusunda veya SQL deyimi içine bitmiş kullanarak karşı uyarı. Veritabanları için belirli bir biçimlendirme dizesi kullanılmalıdır. Eğer zaman bölümünü sıfırlamak ve DateTime bir SQL parametresi olarak yerine getirmek için çalışıyoruz kullanıyorsanız daha iyi.


Soruda, "Sql Server 2005'te bir sorgu üzerinde çalışıyorum" deniyor.
InkHeart

4
@InkHeart ve tüm aşağı seçmenler - Bu cevap 2008 yılında yayınlanmıştır. Orijinal soru için düzenleme geçmişini kontrol ederseniz, hiçbir etiket ve / veya teknoloji ile ilgili diğer bilgiler dahil edilmemiştir.
GSazheniuk
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.