SQL Server DateTime veri türünden yalnızca Tarih döndürme


1778
SELECT GETDATE()

İadeler: 2008-09-22 15:24:13.790

Zaman bölümü olmadan bu tarih bölümünü istiyorum: 2008-09-22 00:00:00.000

Bunu nasıl alabilirim?


4
Eğer zaman olmadan bir tarih veri türü almak istiyorsanız, saat 00:00:00 olsa bile, şansınız kalmamışsa, bir varchar alabilirsiniz, ancak yapı bir datetime ve her zaman biraz zamanınız olacak.
Quintin Robinson

16
Dikkat edilmesi gereken bir nokta, SQL Server 2008'in sadece tarih bileşeni time bileşeni olmadan saklamak için ayrı bir DATE veri türü içermesidir. Daha fazla bilgi için: sql-server-performance.com/articles/dev/datetime_2008_p1.aspx
Ben Hoffstein

7
Çeşitli zaman kaldırma yöntemlerinin performans testi sonuçlarını gösteren bu yayını kaçırmayın .
ErikE

18
Oylar ve kabul edilen cevaptan
yanılmayın

8
@Rohit Yanlışlıkla 2008'in insanların önem verdiği tek sürüm olduğunu varsayıyorsunuz. (Vahşi doğada daha fazla versiyon var.) Oylar kendileri için konuşuyor.
hktegner

Yanıtlar:


2487

Daha SQL Server 2008yüksek ve daha yüksek bir CONVERTtarihle şu tarihlere ulaşmalısınız :

SELECT CONVERT(date, getdate())

Eski sürümlerde aşağıdakileri yapabilirsiniz:

SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, @your_date))

Örneğin

SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))

bana verir

2008-09-22 00:00:00.000

Artıları:

  • Hayır varchar<-> datetimedönüşüm gerekli
  • Düşünmeye gerek yok locale

Michael tarafından önerildiği gibi

Bu varyantı kullanın: SELECT DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)

select getdate()

SELECT DATEADD(hh, DATEDIFF(hh, 0, getdate()), 0)
SELECT DATEADD(hh, 0, DATEDIFF(hh, 0, getdate()))

SELECT DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, getdate()))

SELECT DATEADD(mm, DATEDIFF(mm, 0, getdate()), 0)
SELECT DATEADD(mm, 0, DATEDIFF(mm, 0, getdate()))

SELECT DATEADD(yy, DATEDIFF(yy, 0, getdate()), 0)
SELECT DATEADD(yy, 0, DATEDIFF(yy, 0, getdate()))

Çıktı:

2019-04-19 08:09:35.557

2019-04-19 08:00:00.000
4763-02-17 00:00:00.000

2019-04-19 00:00:00.000
2019-04-19 00:00:00.000

2019-04-01 00:00:00.000
1903-12-03 00:00:00.000

2019-01-01 00:00:00.000
1900-04-30 00:00:00.000

52
+1 Bunun yaygın olarak kullanılan (ayrıca yıllardır kullandığım) double convert () yönteminden% 35 daha hızlı olduğu anlaşılıyor. Güzel bir.
Dane

8
Çözümünüz için görebildiğim tek dezavantajı, ne yaptığını bilmediğiniz sürece biraz geniş olmasıdır. Çift dönüştürme yöntemini kullanmak, niyetlerinizi kod geliştiricileri için daha belirgin hale getirir. BTW Seni alt etmedim. Sanırım ben de yöntemini kullanmaya başlayacağım. Thankyou @aku
Jim Birchall

38
@pilavdzice o günün gece yarısına kadar bir datetime ayarlama yok AYRIL KAPALI ZAMAN. Ne sonuç bekliyorsun? datetimeVeri türü olamaz da hiç bir zaman . Veri depolamayı kullanıcı sunumu ile karıştırdığınızı düşünüyorum. İstediğiniz tek şey, kullanıcıya zaman bölümü olmayan (sıfır değil, yalnızca boşluklar) bir dize göstermenin bir yoluysa, sadece istediğiniz Convert(varchar(30), @Date, 101)veya benzer bir şey. Daha fazla bilgi için bkz. Çevrimiçi SQL Server Kitapları • Yayınla ve Dönüştür .
ErikE

7
@ user1671639 datetime veri türü her zaman hem tarih hem de saat içerir, birini diğeri olmadan anlamlı bir şekilde depolayamazsınız - SQL Server 2008'i kullanmıyorsanız, bu durumda ayrı 'tarih' ve 'saat' verileri de vardır türleri. Bunun gibi CONVERT () kullanırsanız, daha sonra kullanmak için gerçekten bir dize istersiniz, bu nedenle bunu yapmaya devam edersiniz - ancak tarihi kapatmak yerine tarih biçimlendirme işlevlerini kullanmanız daha iyi olurdu - veya CAST(... AS DATE)veya CONVERT(DATE, ...)bu sayfada oldukça sık dile getirilenler.
Magnus

10
Cevabını değiştirmenizi tavsiye ederim, SELECT DATEADD(dd, DATEDIFF(dd, 0, @your_date), 0)çünkü o ddzaman herhangi bir datepartanahtar kelimenin datetimerastgele bir şekilde kısaltılması için değiştirilebilir .
Michael - Clay Shirky

717

SQLServer 2008 artık yalnızca zaman bileşeni olmayan bir tarih içeren bir 'tarih' veri türüne sahiptir. SQLServer 2008 ve daha yenisini kullanan herkes aşağıdakileri yapabilir:

SELECT CONVERT(date, GETDATE())

41
SQL2008'de tarih ve saati ayırma sorununun diğer yarısına cevap veren 'saat' veri türü de vardır.
misteraidan

8
FYI, tarihlerden itibaren zamanı kısaltmanın farklı yöntemlerini karşılaştırdım ve bu en hızlı yöntemdi. Fark küçüktü, ancak çok sayıda infaz üzerinde açıkça daha hızlıydı.
UnhandledExcepSean

2
wt sqlserver 2005 hakkında ??
Dr. MAF

@ Dr.MAF Çevreyi tamamlayan 2008 öncesi cevap burada: stackoverflow.com/questions/113045/…
Frosty840

170

SQL 2008 ve üstü kullanıyorsanız:

select cast(getdate() as date)

3
@FredrickGauss: Ne tür, Tarih? Hangi SQL Server sürümünü kullanıyorsunuz?
abatishchev

7
Dikkat! date1 datetime = '2015-09-30 20: 59: 59.999' ilan et; oyuncu seçimi (tarih olarak @ tarih1) '2015-10-01' değerini döndürür
Nick

6
@Nick: DateTime ile ilgili sorun budur. kullanmak DateTime2yerine ve iyi çalışıyor. sqlfiddle.com/#!6/9eecb7/2833
abatishchev

8
@Nick, abatishchev yanıtını tamamlamak için, @ date1 öğeniz kısıtlamalardan 2015-10-01dolayıdır DateTime. Herhangi bir oyuncu olmadan deneyin Date, o da verir 2015-10-01! declare @date1 datetime = '2015-09-30 23:59:59.999';select @date1=>2015-10-01
Frédéric

4
Bunlardan biri hatırlanması kolay SQL hileleri. Mike'ın dediği gibi, sadece 2008'den itibaren, ancak bir yerde 2005 ve önceki bir DB bulursanız, çok fazla sorun
yaşayabilirsiniz

73

DATEADD ve DATEDIFF varchar dönüştürmek daha iyidir. Her iki sorgu da aynı yürütme planına sahiptir, ancak yürütme planları öncelikle verilerle ilgilidir erişim stratejileriyle ilgilidir ve her zaman tüm parçaları gerçekleştirmek için gereken CPU süresinde yer alan örtük maliyetleri ortaya çıkarmaz. Her iki sorgu da milyonlarca satır içeren bir tabloya karşı çalıştırılırsa, DateDiff kullanan CPU zamanı CPU Dönüştürme süresinin 1 / 3'üne yakın olabilir!

Sorguların yürütme planlarını görmek için:

set showplan_text on
GO 

Hem DATEADD hem de DATEDIFF bir CONVERT_IMPLICIT yürütür.

CONVERT çözümü bazıları için daha basit ve okunması kolay olsa da , daha yavaştır. Tarih saatine geri dönmeye gerek yoktur (bu, dolaylı olarak sunucu tarafından yapılır). DateDd için DateDiff yönteminde gerçek bir ihtiyaç da yoktur, çünkü tamsayı sonucu da örtük olarak datetime değerine dönüştürülür.


TARİHLERDEN DÖNÜŞÜM SEÇİMİ (varchar, MyDate, 101)

  |--Compute Scalar(DEFINE:([Expr1004]=CONVERT(varchar(30),[TEST].[dbo].[DatesTable].[MyDate],101)))
       |--Table Scan(OBJECT:([TEST].[dbo].[DatesTable]))

DATEADD (dd, 0, DATEDIFF (dd, 0, MyDate)) DATETable'DAN SEÇ

  |--Compute Scalar(DEFINE:([Expr1004]=dateadd(day,(0),CONVERT_IMPLICIT(datetime,datediff(day,'1900-01-01 00:00:00.000',CONVERT_IMPLICIT(datetime,[TEST].[dbo].[DatesTable].[MyDate],0)),0))))
       |--Table Scan(OBJECT:([TEST].[dbo].[DatesTable]))

@Digi'nin önerdiği gibi FLOOR () işlevinin kullanılması DateDiff'e yakın bir performansa sahiptir, ancak datetime veri türünün yüzer hale getirilmesi ve geri döndürülmesi her zaman orijinal değeri vermediği için önerilmez.

Çocuklarý hatýrla: Kimseye inanma. Performans istatistiklerine bakın ve kendiniz test edin!

Sonuçlarınızı test ederken dikkatli olun. İstemciye çok sayıda satır seçilmesi, performans farkını gizleyerek satırları ağ üzerinden göndermek, hesaplamaları yapmaktan daha uzun zaman alır. Bu nedenle, tüm satırların çalışmasının sunucu tarafından yapıldığından emin olun, ancak istemciye gönderilen satır kümesi olmadığından emin olun.

Bazı insanlar için önbellek optimizasyonunun sorguları ne zaman etkilediği konusunda kafa karışıklığı var gibi görünüyor. Aynı grupta veya ayrı gruplarda iki sorgu çalıştırmanın önbellekleme üzerinde bir etkisi yoktur. Böylece önbelleği manuel olarak sona erdirebilir veya sorguları birden çok kez ileri geri çalıştırabilirsiniz. Sorgu # 2 için yapılan herhangi bir optimizasyon, sonraki sorguları da etkileyecektir, bu nedenle isterseniz 1 numaralı yürütmeyi atın.

İşte DateDiff'in varchar'a dönüştürmeden çok daha hızlı olduğunu kanıtlayan tam test komut dosyası ve performans sonuçları .


Ricardo C, güzel soruşturma! Hangi SQL sunucusunun sürümünü kullanıyorsunuz? Tarihsel ile MSSQL2000 yöntemi benim için biraz daha hızlı çalışır.
aku

Sadece not etmek gerekirse, 1000.000 kez test yaptım. Gerçek dünya senaryoları için performans farkı fark edilmeyecek, sanırım
aku

Aku, bu test için SQL Server 2005 Express kullandım. 2000'de iş yerinde çalışıyorum ve 24 milyondan fazla sıra içeren bir tabloyla test edeceğim ve neler çıktığını göreceğim.
Ricardo C

Aku, aynı sonuçlar. On milyon satırın üzerinde performans farkı yok.
Ricardo C

5
Eşit performans hakkındaki iddialar doğru değildir. Tabii yürütme planları aynı olacak !!! Bunlar üzerinde performans ölçümü, yürütme planlarını incelemek yerine CPU kullanımını karşılaştırarak YAPILMALIDIR.
ErikE

51

Bunu dene:

SELECT CONVERT(VARCHAR(10),GETDATE(),111)

Yukarıdaki ifade mevcut biçiminizi dönüştürür, tercih ettiğiniz biçimi seçmek için YYYY/MM/DDlütfen bu bağlantıya bakın .


5
Bu benim için '2008/09/22' döndürüyor
eddiegroves

1
SELECT CONVERT (VARCHAR (10), GETDATE (), 101) mm/dd/yyyybiçimidir.
Pire

4
ham metin değerine (DB'nin dışında) göre sıralama yapıyorsanız, 'japonca' biçimi daha iyidir
Simon_Weaver


21

Tarih biçiminde iade için

CAST (Sipariş Tarihi AS tarihi)

Yukarıdaki kod sql server 2010'da çalışacaktır

12.12.2013 gibi geri dönecek

SQL Server 2012 için aşağıdaki kodu kullanın

CONVERT(VARCHAR(10), OrderDate , 111)

1
Bu bana sadece tarihle değil, sıfır tarihle geri dönüyor
Bohemian

1
sql sunucusu kullanıyorsanız hangi sürümü öğrenebilir miyim?
Mahesh ML

1
@MaheshML, MS SQL 2012'de hem tarih hem de saat döndürür.
Marek

1
SQL Azure'da bir cazibe gibi çalışıyor
Martín Coll

5
@MaheshML SQL Server 2010 diye bir şey yoktur.
SvenAelterman


16

Eğer sonuca a olarak ihtiyacınız varsa varchar,

SELECT CONVERT(DATE, GETDATE()) --2014-03-26
SELECT CONVERT(VARCHAR(10), GETDATE(), 111) --2014/03/26

ki bu yukarıda belirtilmişti.

Tarih ve saat biçiminde sonuca ihtiyacınız varsa, aşağıdaki sorgulardan birini kullanmalısınız

  1. SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 111)) AS OnlyDate 

    2014-03-26 00: 00: 00.000

  2. SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 112)) AS OnlyDate 

    2014-03-26 00: 00: 00.000

  3. DECLARE  @OnlyDate DATETIME
    SET @OnlyDate = DATEDIFF(DD, 0, GETDATE())
    SELECT @OnlyDate AS OnlyDate

    2014-03-26 00: 00: 00.000


14
SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),103) --21/09/2011

SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),101) --09/21/2011

SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),111) --2011/09/21

SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),107) --Sep 21, 2011

13

FLOOR () kullanarak - sadece zaman parçasını kesin.

SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)

4
Bu yöntem en hızlı değildir ve aynı zamanda insanlara, yüzmek için tarih atmanın doğru olduğunu, yani doğru olmadığını öğretir. Daha fazla ayrıntı için lütfen bu gönderiye bakın .
ErikE

13

Eğer kullanıyorsanız , SQL Server 2012 veya üzeri sürümleri ,

Format()Fonksiyonu kullanın .

SQL sunucusu için zaten birden fazla yanıt ve biçimlendirme türü var. Ancak yöntemlerin çoğu biraz belirsizdir ve Belirli Tarih Biçimi ile ilgili biçim türü veya işlevlerinin numaralarını hatırlamanız zor olacaktır. Bu nedenle SQL sunucusunun sonraki sürümlerinde daha iyi bir seçenek var.

FORMAT ( value, format [, culture ] )

Görüntüleyenlerinize göre tarih belirtebileceğiniz için Kültür seçeneği çok kullanışlıdır.

D (küçük desenler için) ve D (uzun desenler için) hatırlamanız gerekir.

1. "d" - Kısa tarih örüntüsü.

2009-06-15T13:45:30 -> 6/15/2009 (en-US)
2009-06-15T13:45:30 -> 15/06/2009 (fr-FR)
2009-06-15T13:45:30 -> 2009/06/15 (ja-JP)

2. "D" - Uzun tarih deseni.

2009-06-15T13:45:30 -> Monday, June 15, 2009 (en-US)
2009-06-15T13:45:30 -> 15 июня 2009 г. (ru-RU)
2009-06-15T13:45:30 -> Montag, 15. Juni 2009 (de-DE)

Sorguda daha fazla örnek.

DECLARE @d DATETIME = '10/01/2011';
SELECT FORMAT ( @d, 'd', 'en-US' ) AS 'US English Result'
      ,FORMAT ( @d, 'd', 'en-gb' ) AS 'Great Britain English Result'
      ,FORMAT ( @d, 'd', 'de-de' ) AS 'German Result'
      ,FORMAT ( @d, 'd', 'zh-cn' ) AS 'Simplified Chinese (PRC) Result'; 

SELECT FORMAT ( @d, 'D', 'en-US' ) AS 'US English Result'
      ,FORMAT ( @d, 'D', 'en-gb' ) AS 'Great Britain English Result'
      ,FORMAT ( @d, 'D', 'de-de' ) AS 'German Result'
      ,FORMAT ( @d, 'D', 'zh-cn' ) AS 'Chinese (Simplified PRC) Result';

US English Result Great Britain English Result  German Result Simplified Chinese (PRC) Result
----------------  ----------------------------- ------------- -------------------------------------
10/1/2011         01/10/2011                    01.10.2011    2011/10/1

US English Result            Great Britain English Result  German Result                    Chinese (Simplified PRC) Result
---------------------------- ----------------------------- -----------------------------  ---------------------------------------
Saturday, October 01, 2011   01 October 2011               Samstag, 1. Oktober 2011        2011101

Daha fazla biçim istiyorsanız, şu adrese gidebilirsiniz:

  1. Standart Tarih ve Saat Biçimi Dizeleri
  2. Özel Tarih ve Saat Biçimi Dizeleri

12

CONVERT kullanmak ve pozlanan orijinal sorudakiyle aynı çıktıyı almak istiyorsanız, yani, yyyy-aa-gg CONVERT(varchar(10),[SourceDate as dateTime],121)önceki çiftin cevaplarıyla aynı kodu kullanın , ancak tire ile yyyy-aa-gg'ye dönüştürme kodu 121.

Sabun kutumu bir saniyeliğine alabilirsem, bu tür biçimlendirme veri katmanına ait değildir ve bu yüzden gerçek tarih bölümü veri türleri olduğunda SQL Server 2008'e kadar aptalca yüksek genel 'numaralar' olmadan mümkün değildi tanıttı. Veri katmanında bu tür dönüşümler yapmak, DBMS'nizde büyük bir yük kaybıdır, ancak daha da önemlisi, böyle bir şey yaparsanız, temel olarak, daha sonra bir programa döneceğinizi varsaydığım bellek içi yetim veriler oluşturdunuz. Başka bir 3NF + sütununa geri koyamaz veya geri döndürmeden yazdığınız bir şeyle karşılaştıramazsınız, böylece yaptığınız tek şey başarısızlık noktaları ve ilişkisel referans kaldırıldı.

DAİMA devam etmeli ve dateTime veri türünüzü çağıran programa iade etmelisiniz ve SUNUM katmanında gerekli ayarlamaları yapmalısınız. Arayanlara geri dönmeden önce bir şeyleri dönüştürmeye başlar başlamaz, uygulamadan tüm referans bütünlüğü umudunu kaldırıyorsunuz. Bu, verilerinizi gerekmediğinde tekrar insan / kod / gremlin hatasına maruz bırakan bir tür manuel geri dönüş yapmazsanız, bir UPDATE veya DELETE işlemini önler.


1
Örneğin, kullanıcı tarafından sağlanan bir tarihle eşleşen tüm kayıtları belirli bir zaman alanının tarih bölümü olarak alan bir sorgu istiyorsanız, diyelim . Sadece sunum katmanında iyi şanslar. (Dönüştürmeye ihtiyacınız yok, tarih aritmetiğini kullanabilirsiniz, ancak fikri
anladınız

1
@Andrew neden önemli? Diyorsunuz WHERE col >= @Date AND col < DATEADD(DAY, 1, @Date);- sütundan zaman ayırmak için kesinlikle bir neden yok.
Aaron Bertrand

1
@AaronBertrand Bu sadece girdinin @Datesıfır zaman parçası olduğu varsayılarak çalışır . Bu doğru değilse, yine de sunucu tarafı sürelerini kısaltmayı bilmeniz gerekir. Biçimlendirmenin sunum katmanına bırakılması gerektiği konusunda bu yanıta katılıyorum, ancak bunu ön uç için bırakmanın kısalmanın hızlı bir yolunu bilmeniz gerekmediği anlamına gelmediğini kabul etmedim.
Andrew Lazarus

1
@ Yapmanız gereken tek şey DATE giriş parametresini yapmaktır. Demek istediğim , çoğu insanın ilk içgüdüsü olmasına rağmen , sütuna asla böyle bir kesiklik uygulamak zorunda kalmamanızdır.
Aaron Bertrand

1
@AaronBertrand ve parametrenin veri türü üzerinde kontrolünüz olduğunu varsayar. Saklı bir prosedürde para cezası, diğer durumlarda mümkün değildir. Parametrenin istediğiniz ve ihtiyacınız olan tür olduğundan emin olmak için neden yayınlanmıyorsunuz?
Andrew Lazarus

10
SELECT DATEADD(DD, DATEDIFF(DD, 0, GETDATE()), 0)

SELECT DATEADD(DAY, 0, DATEDIFF(DAY,0, GETDATE()))

SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 101))

Düzenleme: İlk iki yöntem temelde aynıdır ve dışarı varchar yöntemine dönüştürme gerçekleştirin.


1
Bu yöntemlerin hepsi harika, ama hangisini kullanmanızı önerirsiniz?
eddiegroves

3
Üst iki "doğru" sürüm olduğunu Not select dateadd(dd, datediff(dd, 0, getdate()), 0)çünkü ddlar daha sonra herhangi biri için takas edilebilir anahtar kelimeler seçtiğiniz herhangi segmentte tarihini klibi için. (Ayrıca bunun sadece bir kısaltma olduğunu unutmayın .)datepartddday
Michael - Clay Shirky

10

Belirtilen sonucu elde etmek için aşağıdaki komutu kullanıyorum.

SELECT CONVERT(DATETIME,CONVERT(DATE,GETDATE()))

Yararlı olduğunu düşünüyorum.


8
 Convert(nvarchar(10), getdate(), 101) --->  5/12/14

 Convert(nvarchar(12), getdate(), 101) --->  5/12/2014

7

Sonuçları bir sütuna veya değişkene ataıyorsanız, ona DATE türünü verin; dönüşüm örtüktür.

DECLARE @Date DATE = GETDATE()   

SELECT @Date   --> 2017-05-03

6

Bunun sizin durumunuzda işe yarayacağını düşünüyorum:

CONVERT(VARCHAR(10),Person.DateOfBirth,111) AS BirthDate
//here date is obtained as 1990/09/25

6
DECLARE @yourdate DATETIME = '11/1/2014 12:25pm'    
SELECT CONVERT(DATE, @yourdate)

2
Bu öneri başka cevaplar (birden fazla kez) tarafından karşılandı.
Andriy M

6

Tamam, biraz geç kalmama rağmen :), İşte başka bir çözüm.

SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) as DATETIME)

Sonuç

2008-09-22 00:00:00.000

SQL Server 2012 ve sonraki sürümlerini kullanıyorsanız FORMAT(), bunun gibi bir işlev kullanabilirsiniz.

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

İlk örneğinizde hala bir zaman bileşeni var. Sorunun amacı, bunun nasıl kaldırılacağıydı.
Zack

5

Eski MSSQL Server 7.0 bile olsa, buradaki kod (bu bağlantının izniyle ) aradığım tarih formatını almama izin verdi:

PRINT '1) Date/time in format MON DD YYYY HH:MI AM (OR PM): ' + CONVERT(CHAR(19),GETDATE())  
PRINT '2) Date/time in format MM-DD-YY: ' + CONVERT(CHAR(8),GETDATE(),10)  
PRINT '3) Date/time in format MM-DD-YYYY: ' + CONVERT(CHAR(10),GETDATE(),110) 
PRINT '4) Date/time in format DD MON YYYY: ' + CONVERT(CHAR(11),GETDATE(),106)
PRINT '5) Date/time in format DD MON YY: ' + CONVERT(CHAR(9),GETDATE(),6) 
PRINT '6) Date/time in format DD MON YYYY HH:MM:SS:MMM(24H): ' + CONVERT(CHAR(24),GETDATE(),113)

Bu çıktıyı üretti:

1) Date/time in format MON DD YYYY HH:MI AM (OR PM): Feb 27 2015  1:14PM
2) Date/time in format MM-DD-YY: 02-27-15
3) Date/time in format MM-DD-YYYY: 02-27-2015
4) Date/time in format DD MON YYYY: 27 Feb 2015
5) Date/time in format DD MON YY: 27 Feb 15
6) Date/time in format DD MON YYYY HH:MM:SS:MMM(24H): 27 Feb 2015 13:14:46:630

5

Tarih:

DÖNÜŞÜMÜ SEÇ (tarih, AL ())
CAST SEÇ (tarih olarak GETDATE ())

Zaman:

DÖNÜŞÜM DÖNÜŞÜMÜ (zaman, GETDATE (), 114)
CAST SEÇ (zaman olarak GETDATE ())

5

Sadece bu şekilde yapabilirsiniz:

SELECT CONVERT(date, getdate())
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, @your_date))
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))

Çıkışlar:

2008-09-22 00:00:00.000

Veya basitçe şu şekilde yapın:

SELECT CONVERT (DATE, GETDATE()) 'Date Part Only'

Sonuç:

Date Part Only
--------------
2013-07-14

4

neden DATE_FORMAT kullanmıyorsunuz (sizin_datetiem_column, '% d-% m-% Y')?

EX: select DATE_FORMAT( some_datetime_column, '%d-%m-%Y' ) from table_name

'%d-%m-%Y'parçayı yeniden düzenleyerek m, d ve yıl dizilerini değiştirebilirsiniz


4

Bunun eski olduğunu biliyorum, ama kimsenin bunu nerede belirttiğini görmüyorum. Söyleyebileceğim kadarıyla, bu ANSI standardı.

SELECT CAST(CURRENT_TIMESTAMP AS DATE)

Microsoft'un ANSI standart CURRENT_DATE değişkenini de desteklemesi iyi olur.


select {fn current_date()} as todaybenim için çalışıyor.
brianary

@brianary - Güzel, ama ANSI SQL değil.
yaktı

Bu yeterince adil ve cevabınız güzel taşınabilir, ancak T-SQL üzerinde çalıştığımız sürece, bu da işe yarıyor (ve ANSI CURRENT_DATE'in uygulanmasının MS için önemsiz olacağını gösteriyor).
brianary

4

Ben belirtilmemiş olanları tercih ederim:

DATEFROMPARTS(DATEPART(yyyy, @mydatetime), DATEPART(mm, @mydatetime), DATEPART(dd, @mydatetime))

Ayrıca her bir 'datepart' muhtemelen matematik yapıyor olsa da, yerel veya umursamaz. Dolayısıyla, dateiff yönteminden biraz daha yavaş olabilir, ama bana göre çok daha açık. Özellikle sadece yıl ve aya göre gruplandırmak istediğimde (günü 1 olarak ayarlayın).


4

SQL SERVER 2012'den başlayarak şunları yapabilirsiniz:

SELECT FORMAT(GETDATE(), 'yyyy-MM-dd 00:00:00.000')


4

SQL Server 2000'de

CAST(
(
    STR( YEAR( GETDATE() ) ) + '/' +
    STR( MONTH( GETDATE() ) ) + '/' +
    STR( DAY( GETDATE() ) )
)
AS DATETIME)


3

Tarih bölümü ve tarihi biçimlendirmek için aşağıdakileri kullanabilirsiniz:

DATENAME => Belirtilen tarihin belirtilen tarih bölümünü temsil eden bir karakter dizesi döndürür

DATEADD => DATEPART()İşlev, tarih / saatin yıl, ay, gün, saat, dakika gibi tek bir bölümünü döndürmek için kullanılır.

DATEPART => Belirtilen tarihin belirtilen tarih bölümünü temsil eden bir tamsayı döndürür.

CONVERT()=> CONVERT()İşlev, bir veri türündeki bir ifadeyi diğerine dönüştüren genel bir işlevdir. CONVERT()Fonksiyon farklı formatlarda tarih / saat verileri görüntülemek için kullanılabilir.

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.