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?
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?
Yanıtlar:
Daha SQL Server 2008
yüksek ve daha yüksek bir CONVERT
tarihle ş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ı:
varchar
<-> datetime
dönüşüm gereklilocale
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
datetime
Veri 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 .
CAST(... AS DATE)
veya CONVERT(DATE, ...)
bu sayfada oldukça sık dile getirilenler.
SELECT DATEADD(dd, DATEDIFF(dd, 0, @your_date), 0)
çünkü o dd
zaman herhangi bir datepart
anahtar kelimenin datetime
rastgele bir şekilde kısaltılması için değiştirilebilir .
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())
SQL 2008 ve üstü kullanıyorsanız:
select cast(getdate() as date)
DateTime2
yerine ve iyi çalışıyor. sqlfiddle.com/#!6/9eecb7/2833
2015-10-01
dolayı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
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ı .
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/DD
lütfen bu bağlantıya bakın .
mm/dd/yyyy
biçimidir.
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)
Bu CONVERT
işlevi yalnızca tarihi döndürmek için kullanabilirsiniz . Aşağıdaki bağlantılara bakın:
SQL Server 2000'de Tarih ve Saat İşleme
Convert işlevini kullanma sözdizimi:
CONVERT ( data_type [ ( length ) ] , expression [ , style ] )
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
SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 111)) AS OnlyDate
2014-03-26 00: 00: 00.000
SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 112)) AS OnlyDate
2014-03-26 00: 00: 00.000
DECLARE @OnlyDate DATETIME
SET @OnlyDate = DATEDIFF(DD, 0, GETDATE())
SELECT @OnlyDate AS OnlyDate
2014-03-26 00: 00: 00.000
FLOOR () kullanarak - sadece zaman parçasını kesin.
SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)
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.
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)
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 2011年10月1日
Daha fazla biçim istiyorsanız, şu adrese gidebilirsiniz:
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.
WHERE col >= @Date AND col < DATEADD(DAY, 1, @Date);
- sütundan zaman ayırmak için kesinlikle bir neden yok.
@Date
sı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.
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.
select dateadd(dd, datediff(dd, 0, getdate()), 0)
çünkü dd
lar 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 .)datepart
dd
day
Belirtilen sonucu elde etmek için aşağıdaki komutu kullanıyorum.
SELECT CONVERT(DATETIME,CONVERT(DATE,GETDATE()))
Yararlı olduğunu düşünüyorum.
Convert(nvarchar(10), getdate(), 101) ---> 5/12/14
Convert(nvarchar(12), getdate(), 101) ---> 5/12/2014
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
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
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')
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
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 ())
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
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
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 today
benim için çalışıyor.
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).
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.