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.
+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:
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.
@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
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.
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:
SELECTCONVERT(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.
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 ,
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-> 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/201101/10/201101.10.20112011/10/1
US English Result Great Britain English Result German Result Chinese (Simplified PRC) Result
---------------------------- ----------------------------- ----------------------------- ---------------------------------------
Saturday, October 01,201101 October 2011 Samstag,1. Oktober 20112011年10月1日
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.
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?
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.
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 2720151:14PM
2) Date/time in format MM-DD-YY:02-27-153) Date/time in format MM-DD-YYYY:02-27-20154) Date/time in format DD MON YYYY:27 Feb 20155) Date/time in format DD MON YY:27 Feb 156) Date/time in format DD MON YYYY HH:MM:SS:MMM(24H):27 Feb 201513:14:46:630
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).
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).
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.
Odpowiedzi:
Co
SQL Server 2008
najmniej, powinieneśCONVERT
do tej pory:W starszych wersjach możesz wykonać następujące czynności:
na przykład
daje mi
Plusy:
varchar
<->datetime
locale
Jak sugeruje Michael
Użyj tego wariantu:
SELECT DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)
Wynik:
źródło
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 chceszConvert(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)
lubCONVERT(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 innedatepart
słowo kluczowe, aby obciąć jedatetime
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:
źródło
Jeśli używasz SQL 2008 i nowszych wersji:
źródło
DateTime2
zamiast tego i działa dobrze. sqlfiddle.com/#!6/9eecb7/28332015-10-01
powoduDateTime
ograniczeń. Spróbuj bez żadnego obsadyDate
, to2015-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ń:
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
WYBIERZ DATĘDATA (dd, 0, DATEDIFF (dd, 0, MyDate)) FROM 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.
źródło
Spróbuj tego:
Powyższe oświadczenie konwertuje twój obecny format na
YYYY/MM/DD
, skorzystaj z tego linku, aby wybrać preferowany format.źródło
mm/dd/yyyy
format.źródło
Do zwrotu w formacie daty
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
źródło
Możesz użyć tej
CONVERT
funkcji, aby zwrócić tylko datę. Zobacz poniższe linki:Manipulowanie datą i godziną w SQL Server 2000
CAST i CONVERT
Składnia użycia funkcji konwersji jest następująca:
źródło
Jeśli potrzebujesz wyniku jako
varchar
, powinieneś przejśćktóry jest już wspomniany powyżej.
Jeśli potrzebujesz wyniku w formacie daty i godziny, skorzystaj z jednego z poniższych zapytań
źródło
źródło
Za pomocą FLOOR () - po prostu skróć część czasu.
źródło
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.
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.
2. „D” - wzór długiej daty.
Więcej przykładów w zapytaniu.
Jeśli chcesz więcej formatów, możesz przejść do:
źródło
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 121Jeś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.
źródło
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.Edycja: Pierwsze dwie metody są w zasadzie takie same i wykonaj konwersję na metodę varchar.
źródło
select dateadd(dd, datediff(dd, 0, getdate()), 0)
, bodd
s można następnie zamieniane na którekolwiek z tychdatepart
słów kluczowych do klipu datę w każdym segmencie wybrać. (Zauważ też, żedd
to tylko skrótday
.)Aby uzyskać wskazany wynik, używam następującego polecenia.
Uważam, że jest to przydatne.
źródło
źródło
Jeśli przypisujesz wyniki do kolumny lub zmiennej, podaj typ DATE, a konwersja jest niejawna.
źródło
Myślę, że to zadziałałoby w twoim przypadku:
źródło
źródło
Okej, choć trochę się spóźniam :) Oto inne rozwiązanie.
Wynik
A jeśli używasz programu SQL Server 2012 i nowszych wersji, możesz użyć
FORMAT()
takiej funkcji -źródło
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:
Wytworzył ten wynik:
źródło
Data:
Czas:
źródło
Po prostu możesz to zrobić w następujący sposób:
Dane wyjściowe jako:
Lub po prostu zrób tak:
Wynik:
źródło
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ęśćźródło
Wiem, że to stare, ale nie widzę, gdzie ktoś tak to powiedział. Z tego, co mogę powiedzieć, jest to standard ANSI.
Byłoby dobrze, gdyby Microsoft mógł również obsługiwać standardową zmienną CURRENT_DATE ANSI.
źródło
select {fn current_date()} as today
pracuje dla mnie.Popieram następujące, o których nie wspomniano:
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).
źródło
Począwszy od SQL SERVER 2012, możesz to zrobić:
SELECT FORMAT(GETDATE(), 'yyyy-MM-dd 00:00:00.000')
źródło
W SQL Server 2000
źródło
W tym przypadku, tylko data, uruchomimy to zapytanie:
WYBIERZ KONWERSJĘ (VARCHAR (10), getdate (), 111);
źródło
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. TejCONVERT()
funkcji można użyć do wyświetlania danych daty / godziny w różnych formatach.źródło