Vraag Hoe alleen de datum van een datatype van SQL Server DateTime te retourneren


SELECT GETDATE()

Komt terug: 2008-09-22 15:24:13.790

Ik wil dat datumgedeelte zonder het tijdgedeelte: 2008-09-22 00:00:00.000

Hoe kan ik dat krijgen?


1404
2017-09-22 03:31


oorsprong


antwoorden:


Op SQL Server 2008 en hoger, zou je dat moeten doen CONVERT daten:

SELECT CONVERT(date, getdate())

In oudere versies kunt u het volgende doen:

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

bijvoorbeeld

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

geeft me

2008-09-22 00:00:00.000

Voors:

  • Nee varchar<->datetime conversies vereist
  • Niet nodig om over na te denken locale

2056
2017-09-22 03:34



SQLServer 2008 heeft nu een gegevenstype 'datum' dat alleen een datum zonder tijdcomponent bevat. Iedereen die SQLServer 2008 en later gebruikt, kan het volgende doen:

SELECT CONVERT(date, GETDATE())

657
2017-09-24 13:02



Als u SQL 2008 en hoger gebruikt:

select cast(getdate() as date)

141
2018-01-31 09:44



DATEADD en DATEDIFF zijn beter dan CONVERTing naar varchar. Beide vragen hebben hetzelfde uitvoeringsplan, maar de uitvoeringsplannen zijn in de eerste plaats gegevens toegangstrategieën en onthullen niet altijd de impliciete kosten die zijn gemoeid met de benodigde CPU-tijd om alle stukken uit te voeren. Als beide query's worden uitgevoerd in een tabel met miljoenen rijen, kan de CPU-tijd met DateDiff bijna 1 / 3e van de CPU-tijd bij converteren zijn!

Om uitvoeringsplannen voor zoekopdrachten te bekijken:

set showplan_text on
GO 

Zowel DATEADD als DATEDIFF voeren een CONVERT_IMPLICIT uit.

Hoewel de CONVERT-oplossing voor sommigen eenvoudiger en gemakkelijker te lezen is, is het is langzamer. Het is niet nodig om terug te gooien naar datetime (dit wordt impliciet gedaan door de server). Er is ook geen echte behoefte in de DateDiff-methode voor DateAdd daarna omdat het gehele resultaat ook impliciet wordt geconverteerd naar datetime.


SELECT CONVERT (varchar, MyDate, 101) FROM DatesTable

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

SELECT DATEADD (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]))

Het gebruik van FLOOR () zoals @digi suggereerde, heeft prestaties die dichter bij DateDiff liggen, maar het wordt niet aanbevolen om het gegevenstype datetime te laten zweven en terug te geven, levert niet altijd de oorspronkelijke waarde op.

Denk aan jongens: geloof niemand. Bekijk de prestatiestatistieken en test hem zelf!

Wees voorzichtig wanneer u uw resultaten test. Door veel rijen te selecteren in de client, wordt het prestatieverschil verborgen omdat het langer duurt om de rijen over het netwerk te verzenden dan om de berekeningen uit te voeren. Zorg er dus voor dat het werk voor alle rijen wordt gedaan door de server, maar er is geen rijset verzonden naar de client.

Bij sommige mensen lijkt er verwarring te bestaan ​​over wanneer cache-optimalisatie zoekopdrachten beïnvloedt. Het uitvoeren van twee query's in dezelfde batch of in afzonderlijke batches heeft geen effect op caching. U kunt dus de cache handmatig vervallen of de query's meerdere keren heen en weer uitvoeren. Elke optimalisatie voor query # 2 zou ook van invloed zijn op alle volgende query's. Verwijder zo nodig uitvoering # 1 als u dat wilt.

Hier is volledig testscript en prestatieresultaten dat bewijst DateDiff aanzienlijk sneller is dan het omzetten naar varchar.


67
2017-09-22 03:33



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

41
2017-09-22 03:33



SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))

35
2017-09-22 03:34



U kunt de CONVERT functie om alleen de datum te retourneren. Zie de link (s) hieronder:

Manipulatie van datum en tijd in SQL Server 2000

CAST en CONVERT

De syntaxis voor het gebruik van de convert-functie is:

CONVERT ( data_type [ ( length ) ] , expression [ , style ] ) 

18
2017-12-19 06:48