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ć?
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ć?
Odpowiedzi:
Co SQL Server 2008
najmniej, powinieneś CONVERT
do 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:
varchar
<->datetime
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
datetime
danych 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.
CAST(... AS DATE)
lub CONVERT(DATE, ...)
, o czym dość często wspominano na tej samej stronie.
SELECT DATEADD(dd, DATEDIFF(dd, 0, @your_date), 0)
ponieważ dd
można wtedy zamienić dowolne inne datepart
słowo kluczowe, aby obciąć je datetime
na dowolnym poziomie.
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())
Jeśli używasz SQL 2008 i nowszych wersji:
select cast(getdate() as date)
DateTime2
zamiast tego i działa dobrze. sqlfiddle.com/#!6/9eecb7/2833
2015-10-01
powodu DateTime
ograniczeń. Spróbuj bez żadnego obsady Date
, to 2015-10-01
też daje ! declare @date1 datetime = '2015-09-30 23:59:59.999';select @date1
=>2015-10-01
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.
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.
mm/dd/yyyy
format.
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)
Możesz użyć tej CONVERT
funkcji, aby zwrócić tylko datę. Zobacz poniższe linki:
Manipulowanie datą i godziną w SQL Server 2000
Składnia użycia funkcji konwersji jest następująca:
CONVERT ( data_type [ ( length ) ] , expression [ , style ] )
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ń
SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 111)) AS OnlyDate
26.03.2014 00: 00: 00.000
SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 112)) AS OnlyDate
26.03.2014 00: 00: 00.000
DECLARE @OnlyDate DATETIME
SET @OnlyDate = DATEDIFF(DD, 0, GETDATE())
SELECT @OnlyDate AS OnlyDate
26.03.2014 00: 00: 00.000
Za pomocą FLOOR () - po prostu skróć część czasu.
SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)
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).
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)
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 2011年10月1日
Jeśli chcesz więcej formatów, możesz przejść do:
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.
WHERE col >= @Date AND col < DATEADD(DAY, 1, @Date);
- absolutnie nie ma powodu, aby odbierać czas z kolumny.
@Date
ma 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.
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.
select dateadd(dd, datediff(dd, 0, getdate()), 0)
, bo dd
s można następnie zamieniane na którekolwiek z tych datepart
słów kluczowych do klipu datę w każdym segmencie wybrać. (Zauważ też, że dd
to tylko skrót day
.)
Aby uzyskać wskazany wynik, używam następującego polecenia.
SELECT CONVERT(DATETIME,CONVERT(DATE,GETDATE()))
Uważam, że jest to przydatne.
Convert(nvarchar(10), getdate(), 101) ---> 5/12/14
Convert(nvarchar(12), getdate(), 101) ---> 5/12/2014
Jeśli przypisujesz wyniki do kolumny lub zmiennej, podaj typ DATE, a konwersja jest niejawna.
DECLARE @Date DATE = GETDATE()
SELECT @Date --> 2017-05-03
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
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')
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
Data:
WYBIERZ KONWERSJĘ (data, GETDATE ()) WYBIERZ CAST (GETDATE () jako datę)
Czas:
WYBIERZ KONWERSJĘ (czas, GETDATE (), 114) WYBIERZ CAST (GETDATE () jako czas)
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
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ęść
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.
select {fn current_date()} as today
pracuje dla mnie.
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).
W tym przypadku, tylko data, uruchomimy to zapytanie:
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.