Jak zwrócić tylko datę z typu danych DataTime programu SQL Server

1777
SELECT GETDATE()

Zwroty: 2008-09-22 15:24:13.790

Chcę tej części daty bez części czasu: 2008-09-22 00:00:00.000

Jak mogę to zdobyć?

eddiegroves
źródło
4
Jeśli chcesz uzyskać typ danych daty bez czasu, nawet jeśli jest to godzina 00:00:00, nie masz szczęścia, możesz dostać varchar, ale struktura jest datą i zawsze będziesz miał trochę czasu.
Quintin Robinson
16
Należy zauważyć, że SQL Server 2008 zawiera osobny typ danych DATE do przechowywania tylko dat bez komponentu czasu. Więcej informacji tutaj: sql-server-performance.com/articles/dev/datetime_2008_p1.aspx
Ben Hoffstein
7
Nie przegap tego postu pokazującego wyniki testów wydajności różnych metod usuwania czasu.
ErikE,
18
Nie daj się zwieść głosom i zaakceptowanej odpowiedzi, spójrz na stackoverflow.com/a/126984/1155650
Rohit Vipin Mathews
8
@Rohit Niepoprawnie zakładasz, że 2008 jest jedyną wersją, na której zależy ludziom. (Na wolności jest więcej wersji). Głosy mówią same za siebie.
hktegner

Odpowiedzi:

2487

Co SQL Server 2008najmniej, powinieneś CONVERTdo tej pory:

SELECT CONVERT(date, getdate())

W starszych wersjach możesz wykonać następujące czynności:

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

na przykład

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

daje mi

2008-09-22 00:00:00.000

Plusy:

  • Nie są wymagane konwersje varchar<->datetime
  • Nie musisz o tym myśleć locale

Jak sugeruje Michael

Użyj tego wariantu: 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()))

Wynik:

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
aku
źródło
52
+1 Wygląda na to, że ta metoda jest o 35% szybsza niż powszechnie stosowana metoda podwójnej konwersji () (której również używałem od lat). Niezłe.
Dane
8
Jedynym minusem, jaki widzę w twoim rozwiązaniu, jest to, że jeśli nie wiesz, co to robi, jest to trochę tępy. Korzystanie z metody podwójnej konwersji sprawia, że ​​twoje zamiary stają się bardziej oczywiste dla przyszłych twórców kodu. BTW Nie przegłosowałem cię. Myślę, że zacznę też używać twojej metody. Dziękuję @aku
Jim Birchall,
38
@pilavdzice Ustawianie datetime do północy tego dnia nie opuść czas. Jakiego rezultatu oczekujesz? Typ datetimedanych nie może mieć w ogóle czasu . Myślę, że mylisz przechowywanie danych z prezentacją użytkownika. Jeśli wszystko, czego chcesz, to sposób pokazania użytkownikowi ciągu, który nie ma części czasu (nie zer, tylko puste miejsca), po prostu chcesz Convert(varchar(30), @Date, 101)lub coś podobnego. Zobacz Książki SQL Server online • Przesyłaj i konwertuj, aby uzyskać więcej informacji.
ErikE,
7
@ user1671639 typ danych datetime zawsze zawiera zarówno datę, jak i godzinę, nie można rozsądnie przechowywać jednego bez drugiego - chyba że używasz SQL Server 2008, w którym to przypadku istnieją również osobne dane „data” i „godzina” typy. Jeśli użyjesz CONVERT () w ten sposób, naprawdę chcesz ciąg znaków do późniejszego użycia, więc utkniesz robiąc to w ten sposób - chociaż byłoby lepiej, gdybyś użył funkcji formatowania daty zamiast wycinać datę - lub za pośrednictwem CAST(... AS DATE)lub CONVERT(DATE, ...), o czym dość często wspominano na tej samej stronie.
Magnus
10
Zalecam zmianę odpowiedzi na, SELECT DATEADD(dd, DATEDIFF(dd, 0, @your_date), 0)ponieważ ddmożna wtedy zamienić dowolne inne datepartsłowo kluczowe, aby obciąć je datetimena dowolnym poziomie.
Michael - Where's Clay Shirky
717

SQLServer 2008 ma teraz typ danych „data”, który zawiera tylko datę bez składnika czasu. Każdy korzystający z SQLServer 2008 i nowszych wersji może wykonać następujące czynności:

SELECT CONVERT(date, GETDATE())
BenR
źródło
41
Istnieje również typ danych „czas” w SQL2008, który odpowiada na drugą połowę pytania o oddzielenie daty i godziny.
misteraidan
8
Do twojej wiadomości, porównałem różne metody skracania czasu od dat i była to najszybsza metoda. To prawda, że ​​różnica była niewielka, ale była wyraźnie szybsza w przypadku dużej liczby egzekucji.
UnhandledExcepSean
2
wt o sqlserver 2005 ??
Dr. MAF,
@ Dr.MAF Kończąc krąg, odpowiedź sprzed 2008 roku jest dostępna: stackoverflow.com/questions/113045/…
Frosty840
170

Jeśli używasz SQL 2008 i nowszych wersji:

select cast(getdate() as date)
abatishchev
źródło
3
@FredrickGauss: Jaki typ, data? Jakiej wersji programu SQL Server używasz?
abatishchev
7
Strzec się! deklarować @ data1 datetime = „2015-09-30 20: 59: 59.999”; wybierz obsada (@ data1 jako data) zwraca „2015-10-01”
Nick
6
@Nick: to jest problem z DateTime. użyj DateTime2zamiast tego i działa dobrze. sqlfiddle.com/#!6/9eecb7/2833
abatishchev
8
@Nick, aby uzupełnić odpowiedź abatishchev, twoja @ date1 rzeczywiście jest z 2015-10-01powodu DateTimeograniczeń. Spróbuj bez żadnego obsady Date, to 2015-10-01też daje ! declare @date1 datetime = '2015-09-30 23:59:59.999';select @date1=>2015-10-01
Frédéric,
4
Jedna z tych łatwych do zapamiętania sztuczek SQL. Jak mówi Mike, dopiero w 2008 roku, ale jeśli gdzieś znajdziesz DB i 2005, możesz mieć wiele problemów :)
NicVerAZ
73

DATEADD i DATEDIFF są lepsze niż CONVERTING to varchar. Oba zapytania mają ten sam plan wykonania, ale plany wykonania dotyczą przede wszystkim strategii dostępu do danych i nie zawsze ujawniają ukryte koszty związane z czasem procesora wymaganym do wykonania wszystkich elementów. Jeśli oba zapytania są uruchamiane względem tabeli z milionami wierszy, czas pracy procesora przy użyciu DateDiff może być zbliżony do 1/3 czasu konwersji procesora!

Aby zobaczyć plany wykonania zapytań:

set showplan_text on
GO 

Zarówno DATEADD, jak i DATEDIFF wykonają CONVERT_IMPLICIT.

Chociaż dla niektórych rozwiązanie CONVERT jest prostsze i łatwiejsze do odczytania, jest wolniejsze. Nie ma potrzeby przesyłania z powrotem do daty / godziny (jest to domyślnie wykonywane przez serwer). Nie ma też rzeczywistej potrzeby późniejszej metody DateDiff dla DateAdd, ponieważ wynik liczb całkowitych zostanie również domyślnie przekonwertowany z powrotem na datę i godzinę.


WYBIERZ KONWERSJĘ (varchar, MyDate, 101) FROM DatesTable

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

WYBIERZ DATĘDATA (dd, 0, DATEDIFF (dd, 0, MyDate)) FROM DatesTable

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

Używanie FLOOR () jak sugeruje @digi, ma wydajność zbliżoną do DateDiff, ale nie jest zalecane, ponieważ rzutowanie typu danych datetime na zmiennoprzecinkowe i odwrotnie nie zawsze daje oryginalną wartość.

Pamiętajcie chłopaki: nie wierzcie nikomu. Spójrz na statystyki wydajności i sprawdź to sam!

Zachowaj ostrożność podczas testowania wyników. Wybranie wielu wierszy do klienta ukryje różnicę wydajności, ponieważ wysłanie wierszy przez sieć zajmuje więcej czasu niż wykonanie obliczeń. Upewnij się więc, że praca dla wszystkich wierszy jest wykonywana przez serwer, ale do klienta nie wysłano zestawu wierszy.

Wydaje się, że niektórzy ludzie mają wątpliwości co do tego, kiedy optymalizacja pamięci podręcznej wpływa na zapytania. Uruchomienie dwóch zapytań w tej samej partii lub w oddzielnych partiach nie ma wpływu na buforowanie. Możesz więc ręcznie wygaśnąć pamięć podręczną lub po prostu uruchomić zapytania wielokrotnie w tę iz powrotem. Każda optymalizacja dla zapytania nr 2 wpłynie również na wszelkie kolejne zapytania, więc jeśli chcesz, wyrzuć wykonanie nr 1.

Oto pełny skrypt testu i wyniki wydajności, które dowodzą, że DateDiff jest znacznie szybszy niż konwersja na varchar.

Ricardo C.
źródło
Ricardo C, niezłe śledztwo! Jakiej wersji serwera SQL używasz? Metoda MSSQL2000 z datownikiem działa dla mnie nieco szybciej.
aku
Dla przypomnienia wykonałem test 1000 000 razy. Scenariusze dla świata rzeczywistego różnica wydajności nie będzie zauważalny, myślę
aku
Aku, użyłem SQL Server 2005 Express do tego testu. Pracuję w 2000 roku w pracy i przetestuję go na stole z ponad 24 milionami wierszy i zobaczę, co z tego wyniknie.
Ricardo C
Aku, te same wyniki. Brak różnicy w wydajności w ponad dziesięciu milionach rzędów.
Ricardo C,
5
Twierdzenia o równej wydajności nie są prawdziwe. Oczywiście plany wykonania będą takie same !!! Pomiar wydajności MUSI być wykonywany przez porównanie użycia procesora, a nie badanie planów wykonania.
ErikE
51

Spróbuj tego:

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

Powyższe oświadczenie konwertuje twój obecny format na YYYY/MM/DD, skorzystaj z tego linku, aby wybrać preferowany format.

Nescio
źródło
5
Zwraca mi to „2008/09/22”
eddiegroves
1
SELECT CONVERT (VARCHAR (10), GETDATE (), 101) to mm/dd/yyyyformat.
Flea,
4
jeśli sortujesz w oparciu o surową wartość tekstową (poza DB), wtedy format „japoński” jest lepszy
Simon_Weaver
40
SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))
Cade Roux
źródło
21

Do zwrotu w formacie daty

CAST (Data zamówienia Data AS)

Powyższy kod będzie działał na serwerze SQL 2010

Wróci jak 12.12.2013

W przypadku SQL Server 2012 użyj poniższego kodu

CONVERT(VARCHAR(10), OrderDate , 111)
Mahesh ML
źródło
1
Zwraca mi datę zero czasu, a nie tylko datę
czeski
1
czy mogę wiedzieć, której wersji, jeśli używasz serwera SQL?
Mahesh ML
1
@ MaheshML zwraca zarówno datę, jak i godzinę w MS SQL 2012.
Marek
1
Działa jak urok w SQL Azure
Martín Coll
5
@MaheshML Nie ma czegoś takiego jak SQL Server 2010.
SvenAelterman
16

Jeśli potrzebujesz wyniku jako varchar, powinieneś przejść

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

który jest już wspomniany powyżej.

Jeśli potrzebujesz wyniku w formacie daty i godziny, skorzystaj z jednego z poniższych zapytań

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

    26.03.2014 00: 00: 00.000

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

    26.03.2014 00: 00: 00.000

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

    26.03.2014 00: 00: 00.000

Stephon Johns
źródło
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
Rushda
źródło
13

Za pomocą FLOOR () - po prostu skróć część czasu.

SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)
DiGi
źródło
4
Ta metoda nie jest najszybsza, a także domyślnie uczy ludzi, że rzutowanie dat na zmienne jest dokładne, a nie jest. Więcej informacji można znaleźć w tym poście .
ErikE
13

Jeśli używasz programu SQL Server 2012 lub nowszej wersji ,

Posługiwać się Format() funkcji.

Istnieje już wiele odpowiedzi i typów formatowania dla serwera SQL. Ale większość metod jest nieco niejednoznaczna i trudno byłoby zapamiętać liczby dla typu formatu lub funkcji w odniesieniu do określonego formatu daty. Dlatego w następnych wersjach serwera SQL jest lepsza opcja.

FORMAT ( value, format [, culture ] )

Opcja Kultura jest bardzo przydatna, ponieważ możesz określić datę według swoich widzów.

Musisz pamiętać o d (dla małych wzorów) i D (dla długich wzorów).

1. „d” - wzór krótkiej daty.

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” - wzór długiej daty.

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)

Więcej przykładów w zapytaniu.

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

Jeśli chcesz więcej formatów, możesz przejść do:

  1. Standardowe ciągi formatujące datę i godzinę
  2. Niestandardowe ciągi formatujące datę i godzinę
Somnath Muluk
źródło
12

JEŻELI chcesz użyć CONVERT i uzyskać takie same dane wyjściowe jak w postawionym pierwotnym pytaniu, to znaczy rrrr-mm-dd, a następnie użyj tego CONVERT(varchar(10),[SourceDate as dateTime],121)samego kodu, co w poprzednich parach odpowiedzi, ale kod do konwersji na rrrr-mm-dd z myślnikami to 121

Jeśli mogę dostać się na moją skrzynkę mydlaną przez sekundę, ten rodzaj formatowania nie należy do warstwy danych , i dlatego nie było to możliwe bez głupich sztuczek o wysokim koszcie do SQL Server 2008, kiedy rzeczywiste typy danych datepart są wprowadzono. Wykonywanie takich konwersji w warstwie danych jest ogromnym marnotrawstwem na DBMS, ale co ważniejsze, gdy robisz coś takiego, w zasadzie utworzyłeś osierocone dane w pamięci, które, jak zakładam, powrócisz do programu. Nie możesz umieścić go z powrotem w innej kolumnie 3NF + ani porównać z czymkolwiek wpisanym bez cofania, więc wszystko, co zrobiłeś, to wprowadzenie punktów awarii i usunięcie odniesienia relacyjnego.

ZAWSZE należy ZAWSZE kontynuować i zwrócić typ danych dateTime do programu wywołującego oraz w warstwie PREZENTACJA dokonać wszelkich niezbędnych korekt. Jak tylko zaczniesz konwertować rzeczy przed zwróceniem ich do osoby dzwoniącej, usuwasz wszelką nadzieję na integralność referencyjną z aplikacji. Pozwoliłoby to uniknąć operacji UPDATE lub DELETE, chyba że wykonasz jakąś ręczną rewersję, która ponownie naraża twoje dane na błąd człowieka / kodu / gremlina, kiedy nie jest to konieczne.

Focusyn
źródło
1
Z wyjątkiem, powiedzmy, jeśli chcesz zapytania, które pobiera wszystkie rekordy pasujące do daty podanej przez użytkownika jako część daty w określonym polu czasu. Powodzenia w robieniu tego tylko w warstwie prezentacji. (Nie musisz konwertować, możesz użyć arytmetyki dat, ale masz pomysł…)
Andrew Lazarus
1
@Andrew, dlaczego to ma znaczenie? Mówisz WHERE col >= @Date AND col < DATEADD(DAY, 1, @Date);- absolutnie nie ma powodu, aby odbierać czas z kolumny.
Aaron Bertrand
1
@AaronBertrand Działa to tylko przy założeniu, że wejście @Datema część czasu zero. Jeśli nie jest to prawdą, musisz wiedzieć, jak skracać czasy po stronie serwera. Zgadzam się z tą odpowiedzią, że formatowanie należy pozostawić warstwie prezentacji, ale nie zgodziłem się z implikacją, że pozostawienie tego dla interfejsu oznacza, że ​​nie musisz znać szybkiego sposobu obcinania.
Andrew Lazarus
1
@Andrew wszystko, co musisz zrobić, to wprowadzić parametr wejściowy DATE. Wciąż uważam, że nie powinieneś nigdy stosować takiego obcięcia kolumny , mimo że jest to pierwszy instynkt większości ludzi.
Aaron Bertrand
1
@AaronBertrand i że zakłada masz kontrolę nad typ danych parametru. W porządku w procedurze przechowywanej, nie jest to możliwe w innych sytuacjach. Dlaczego nie przesłać, aby upewnić się, że parametr jest typu, którego chcesz i potrzebujesz?
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))

Edycja: Pierwsze dwie metody są w zasadzie takie same i wykonaj konwersję na metodę varchar.

Gordon Bell
źródło
1
Wszystkie te metody są świetne, ale który z nich sugerujesz użyć?
eddiegroves
3
Zauważ, że „poprawna” wersja górze dwa to select dateadd(dd, datediff(dd, 0, getdate()), 0), bo dds można następnie zamieniane na którekolwiek z tych datepartsłów kluczowych do klipu datę w każdym segmencie wybrać. (Zauważ też, że ddto tylko skrót day.)
Michael - Where's Clay Shirky
10

Aby uzyskać wskazany wynik, używam następującego polecenia.

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

Uważam, że jest to przydatne.

Anderson Silva
źródło
8
 Convert(nvarchar(10), getdate(), 101) --->  5/12/14

 Convert(nvarchar(12), getdate(), 101) --->  5/12/2014
Ankit Khetan
źródło
7

Jeśli przypisujesz wyniki do kolumny lub zmiennej, podaj typ DATE, a konwersja jest niejawna.

DECLARE @Date DATE = GETDATE()   

SELECT @Date   --> 2017-05-03
Art Schmidt
źródło
6

Myślę, że to zadziałałoby w twoim przypadku:

CONVERT(VARCHAR(10),Person.DateOfBirth,111) AS BirthDate
//here date is obtained as 1990/09/25
bishnu karki
źródło
6
DECLARE @yourdate DATETIME = '11/1/2014 12:25pm'    
SELECT CONVERT(DATE, @yourdate)
etni
źródło
2
Ta sugestia została ujęta w innych odpowiedziach (więcej niż jeden raz).
Andriy M,
6

Okej, choć trochę się spóźniam :) Oto inne rozwiązanie.

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

Wynik

2008-09-22 00:00:00.000

A jeśli używasz programu SQL Server 2012 i nowszych wersji, możesz użyć FORMAT()takiej funkcji -

SELECT FORMAT(GETDATE(), 'yyyy-MM-dd')
Krishnraj Rana
źródło
Twój pierwszy przykład wciąż ma komponent czasu. Chodziło o to, jak to usunąć.
Zack,
5

Nawet używając starożytnego MSSQL Server 7.0, kod tutaj (dzięki uprzejmości tego linku ) pozwolił mi uzyskać dowolny format daty, którego szukałem w tym czasie:

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)

Wytworzył ten wynik:

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
tumultous_rooster
źródło
5

Data:

WYBIERZ KONWERSJĘ (data, GETDATE ())
WYBIERZ CAST (GETDATE () jako datę)

Czas:

WYBIERZ KONWERSJĘ (czas, GETDATE (), 114)
WYBIERZ CAST (GETDATE () jako czas)
Kris Khairallah
źródło
5

Po prostu możesz to zrobić w następujący sposób:

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

Dane wyjściowe jako:

2008-09-22 00:00:00.000

Lub po prostu zrób tak:

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

Wynik:

Date Part Only
--------------
2013-07-14
Amar Srivastava
źródło
4

dlaczego nie użyjesz DATE_FORMAT (twoja_katalog_kolumny, '% d-% m-% Y')?

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

możesz zmienić kolejność m, d i rok, zmieniając '%d-%m-%Y'część

Janaka R Rajapaksha
źródło
4

Wiem, że to stare, ale nie widzę, gdzie ktoś tak to powiedział. Z tego, co mogę powiedzieć, jest to standard ANSI.

SELECT CAST(CURRENT_TIMESTAMP AS DATE)

Byłoby dobrze, gdyby Microsoft mógł również obsługiwać standardową zmienną CURRENT_DATE ANSI.

oświetlony
źródło
select {fn current_date()} as todaypracuje dla mnie.
Brianary
@brianary - Fajnie, ale to nie jest ANSI SQL.
zapalił
To dość uczciwe, a twoja odpowiedź jest całkiem przenośna, ale pomyślałem, że dopóki pracujemy nad T-SQL, to również działa (i pokazuje, że wdrożenie ANSI CURRENT_DATE byłoby proste dla MS).
Brianary
4

Popieram następujące, o których nie wspomniano:

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

Nie obchodzi go także lokalny ani podwójny konwersja - chociaż każdy „datepart” prawdopodobnie ma matematykę. Może to być nieco wolniejsze niż metoda datowana, ale dla mnie jest to o wiele wyraźniejsze. Zwłaszcza gdy chcę pogrupować według roku i miesiąca (ustaw dzień na 1).

Gerard ONeill
źródło
4

Począwszy od SQL SERVER 2012, możesz to zrobić:

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

xbb
źródło
4

W SQL Server 2000

CAST(
(
    STR( YEAR( GETDATE() ) ) + '/' +
    STR( MONTH( GETDATE() ) ) + '/' +
    STR( DAY( GETDATE() ) )
)
AS DATETIME)
kaub0st3r
źródło
4

W tym przypadku, tylko data, uruchomimy to zapytanie:

WYBIERZ KONWERSJĘ (VARCHAR (10), getdate (), 111);wprowadź opis zdjęcia tutaj

Mohammad Neamul Islam
źródło
To powinna być zaakceptowana odpowiedź.
noobprogrammer
3

Możesz użyć następujących elementów do daty i formatowania daty:

DATENAME => Zwraca ciąg znaków reprezentujący określony fragment daty określonej daty

DATEADD => DATEPART()Funkcja służy do zwrócenia pojedynczej części daty / godziny, takiej jak rok, miesiąc, dzień, godzina, minuta itp.

DATEPART => Zwraca liczbę całkowitą, która reprezentuje określony datepart określonej daty.

CONVERT()=> CONVERT()Funkcja jest funkcją ogólną, która konwertuje wyrażenie jednego typu danych na inny. Tej CONVERT()funkcji można użyć do wyświetlania danych daty / godziny w różnych formatach.

użytkownik1151326
źródło