Jak wybrać datę bez czasu w SQL

Odpowiedzi:

148

Chyba chce sznurka.

select convert(varchar(10), '2011-02-25 21:17:33.933', 120)

120 tu mówi funkcję konwersji, które przekroczyły datę wejścia w następującym formacie : yyyy-mm-dd hh:mi:ss.

bernd_k
źródło
Po co jest 120?
Павле
@ Przeczytaj ten artykuł Style daty i godziny
Fox Vĩnh Tâm
użyłem tego wyboru konwersji (varchar (10), APPROVED_DATE, 120), dostałem kolumnę błędów APPROVED_DATE datetime, jak to przekonwertować? błąd Nie można powiązać wieloczęściowego identyfikatora „LAB_RESULTS.APPROVED_DATE”.
Abdullah
530

W przypadku SQL Server 2008:

Convert(date, getdate())  

Zapoznaj się z https://docs.microsoft.com/en-us/sql/t-sql/functions/getdate-transact-sql

Prad9
źródło
6
Pojawia się komunikat „Data typu nie jest zdefiniowanym typem systemu”.
SeaDrive
10
DATEjest nowy w 2008 roku.
Tim Schmelter
33
nie mam pojęcia, dlaczego jest to tak pozytywna odpowiedź. to pytanie dotyczy SQL Server 2005, NIE 2008. 2005 nie ma typu datedanych, dlatego renderowanie tego rozwiązania jest nieprawidłowe.
Joshua Burns
84
Jest to doceniane, ponieważ ludzie szukają rozwiązań swojego problemu, a nie autorzy. Więc jeśli 110 osób uzna, że ​​to działało dla nich, myślę, że to uczciwe, że ma 110 głosów pozytywnych.
James
Mam ten sam błąd, gdy korzystam z funkcji wyboru konwersji (table.order_date, getdate ()); SQL Server wersja 2017, błąd (Data typu nie jest zdefiniowanym typem systemu) typ kolumny datetime
Abdullah
57

Najszybszy jest datediffnp

select dateadd(d, datediff(d,0, [datecolumn]), 0), other..
from tbl

Ale jeśli potrzebujesz tylko użyć wartości, możesz pominąć dateadd, np

select ...
WHERE somedate <= datediff(d, 0, getdate())

gdzie wyrażenie datediff(d, 0, getdate())jest wystarczające, aby zwrócić dzisiejszą datę bez części czasu.

RichardTheKiwi
źródło
Stary, ale dobry, używał tej sztuczki dziesiątki razy w starszych bazach danych 2000/2005.
KeithS,
43

Użyj CAST (GETDATE () jako daty), który zadziałał dla mnie, proste.

Anna-Leny
źródło
gdzie dodam nazwę mojej kolumny? wybrać obsadę (getdate () jako datę, data_ zamówienia)?
Abdullah
@AbdullahCAST(order_date AS DATE)
Andrew Morton
12

możesz użyć w ten sposób

SELECT Convert(varchar(10), GETDATE(),120) 
A.Goutam
źródło
gdzie umieszczę datę zamówienia nazwy kolumny?
Abdullah
10

W przypadku starszej wersji 2008 :

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

Domcha
źródło
brawa za to! Inne rozwiązania opierają się tylko na części varchar (10), która po prostu obcina wartość.
Gonza Oviedo
2

Jest trochę późno, ale użyj funkcji „curdate” ODBC (nawiasy kątowe „fn” to sekwencja ucieczki funkcji ODBC).

SELECT {fn curdate()} 

Wynik: 2013-02-01

Stefan Steiger
źródło
4
Jestem szczerze ciekawy, jak według ciebie twoja odpowiedź jest lepsza niż odpowiedź zaakceptowana. A może odwołujesz się do innych odpowiedzi?
Mikael Eriksson
1
@Mikael Eriksson: Hmm, ponieważ funkcje ODBC są funkcjami kanonicznymi, a zatem indeksowalnymi, w przeciwieństwie do niedeterministycznych funkcji SQL Server. Ale nieważne, to tylko problem ze skalowaniem, kiedy przechodzisz od 3 wpisów w testowaniu do 1 * 10E6 w produkcji, nie ma żadnych problemów podczas programowania;)
Stefan Steiger
8
Jeśli uruchomisz to zapytanie SELECT {fn curdate()} FROM (SELECT 1) AS T(X)i spojrzysz na rzeczywisty plan wykonania (wersja xml), zobaczysz, że to, co jest faktycznie wykonane, jest CONVERT(varchar(10),getdate(),23). Tak typ danych tej funkcji ODBC jest varchar(10)co oznacza, że jeśli chcesz porównać wynik z datetimedostaniesz niejawna konwersja z varchar(10)celu datetimena sznurkuyyyy-mm-dd . Ta niejawna konwersja zakończy się niepowodzeniem set dateformat dmy.
Mikael Eriksson,
1
@Mikael Eriksson: Wygląda jak błąd, zamiast tego powinni używać SELECT CONVERT (char (8), GETDATE (), 112).
Stefan Steiger
„funkcje kanoniczne i dlatego indeksowalne, w przeciwieństwie do niedeterministycznych funkcji SQL-Server” - eee, co?
Martin Smith,
2

Możesz też spróbować tego.

SELECT CONVERT(DATE, GETDATE(), 120)
Ram Pratap
źródło
2

Konwertuj go z powrotem na datę i godzinę po konwersji na datę, aby w razie potrzeby zachować ten sam czas

select Convert(datetime, Convert(date, getdate())  )
RollRoll
źródło
2

Jeśli potrzebujesz czasu na zera, takie jak 2018-01-17 00:00:00.000:

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

Simon Alphonse
źródło
Dzięki, tego właśnie szukałem.
Pratik Ghag
1

Użycie jest proste:

convert(date, Btch_Time)

Przykład poniżej:

Stół:

Efft_d       Loan_I  Loan_Purp_Type_C   Orig_LTV    Curr_LTV    Schd_LTV    Un_drwn_Bal_a      Btch_Time            Strm_I  Btch_Ins_I
2014-05-31  200312500   HL03             NULL         1.0000    1.0000         1.0000      2014-06-17 11:10:57.330  1005    24851e0a-53983699-14b4-69109


Select * from helios.dbo.CBA_SRD_Loan where Loan_I in ('200312500') and convert(date, Btch_Time) = '2014-06-17'
Arvind Kumar
źródło
1

Jest już za późno, ale obserwowanie mnie zadziałało

declare @vCurrentDate date=getutcdate()

select @vCurrentDate

Gdy typem danych jest data, godziny zostaną obcięte

Naveed Yousaf
źródło
0

W PLSQL możesz używać

to_char(SYSDATE,'dd/mm/yyyy')
Morterox
źródło
rozważ przeniesienie tego do komentarza.
xlembouras
To pytanie dotyczy SQL Server ... nie Oracle
Ben
0

Najpierw przekonwertuj datę na liczbę zmiennoprzecinkową (która wyświetla wartość liczbową), następnie ROUNDliczbę na 0 miejsc po przecinku, a następnie przekonwertuj ją na datę i godzinę .

convert(datetime,round(convert(float,orderdate,101),0) ,101)
użytkownik4162468
źródło
0

Jeśli chcesz zwrócić typ daty, wystarczy użyć daty

CONVERT(date, SYSDATETIME())

lub

SELECT CONVERT(date,SYSDATETIME()) 

lub

DECLARE @DateOnly Datetime
SET @DateOnly=CONVERT(date,SYSDATETIME())
TMP ByKIS
źródło
0

Spróbuj tego.

SELECT DATEADD(DD, 0, DATEDIFF(DD, 0, GETDATE()))
Ram Pratap
źródło