Alleen de datum retourneren van een SQL Server DateTime-gegevenstype

Retouren: 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?


Antwoord 1, autoriteit 100%

Op SQL Server 2008 en hoger moet u tot nu toe CONVERT:

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

Pluspunten:

  • Geen varchar<->datetime conversies vereist
  • Je hoeft niet na te denken over locale

Zoals voorgesteld door Michael

Gebruik deze variant: 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()))

Uitvoer:

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

Antwoord 2, autoriteit 28%

SQLServer 2008 heeft nu een datatype ‘datum’ dat alleen een datum zonder tijdcomponent bevat. Iedereen die SQLServer 2008 en hoger gebruikt, kan het volgende doen:

SELECT CONVERT(date, getdate())

Antwoord 3, autoriteit 7%

Bij gebruik van SQL 2008 en hoger:

select cast(getdate() as date)

Antwoord 4, autoriteit 3%

DATEADD en DATEDIFF zijn beter dan CONVERTEN naar varchar. Beide query’s hebben hetzelfde uitvoeringsplan, maar uitvoeringsplannen hebben voornamelijk betrekking op toegangsstrategieën voor gegevens en onthullen niet altijd de impliciete kosten die gemoeid zijn met de CPU-tijd die nodig is om alle onderdelen uit te voeren. Als beide query’s worden uitgevoerd op een tabel met miljoenen rijen, kan de CPU-tijd met DateDiff bijna 1/3 van de CPU-conversietijd bedragen!

Om uitvoeringsplannen voor zoekopdrachten te zien:

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 deze is langzamer. Het is niet nodig om terug te casten naar datetime (dit wordt impliciet gedaan door de server). Het is ook niet echt nodig in de DateDiff-methode voor DateAdd achteraf, omdat het integer-resultaat ook impliciet terug naar datetime wordt geconverteerd.


SELECTEER CONVERT(varchar, MijnDatum, 101) UIT DatumsTabel

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

SELECTEER DATEADD(dd, 0, DATEDIFF(dd, 0, MijnDatum)) UIT Datumtabel

  |--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 dichter bij DateDiff, maar wordt niet aanbevolen omdat het casten van het datatype datetime naar float en terug niet altijd de oorspronkelijke waarde oplevert.

Onthoud jongens: geloof niemand. Bekijk de prestatiestatistieken en test het zelf!

Wees voorzichtig wanneer u uw resultaten test. Als u veel rijen naar de client selecteert, 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 door de server wordt gedaan, maar dat er geen rijenset naar de client wordt verzonden.

Sommige mensen lijken verwarring te hebben over wanneer cache-optimalisatie van invloed is op zoekopdrachten. Het uitvoeren van twee query’s in dezelfde batch of in afzonderlijke batches heeft geen effect op caching. U kunt de cache dus handmatig laten verlopen of de query’s eenvoudig meerdere keren heen en weer uitvoeren. Elke optimalisatie voor query #2 zou ook van invloed zijn op eventuele volgende query’s, dus gooi uitvoering #1 weg als u wilt.

Hier is volledig testscript en prestatieresultaten die bewijzen dat DateDiff aanzienlijk sneller is dan converteren naar varchar.


Antwoord 5, autoriteit 2%

Probeer dit:

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

De bovenstaande verklaring converteert uw huidige indeling naar YYYY/MM/DD, raadpleeg deze link om het gewenste formaat te kiezen.


Antwoord 6, autoriteit 2%

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

Antwoord 7

Voor teruggave in datumnotatie

CAST(OrderDatum AS-datum)

De bovenstaande code werkt in sql server 2010

Het komt terug zoals 12/12/2013

Gebruik voor SQL Server 2012 de onderstaande code

CONVERT(VARCHAR(10), OrderDate , 111)

Antwoord 8

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

Datum- en tijdmanipulatie in SQL Server 2000

CAST en CONVERT

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

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

Antwoord 9

Als je het resultaat als een varchar nodig hebt, ga je door

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

wat hierboven al genoemd is.

Als u resultaten in datum- en tijdnotatie nodig heeft, kunt u een van de onderstaande zoekopdrachten gebruiken

  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


Antwoord 10

Als u SQL Server 2012 of hogere versies gebruikt,

Gebruik FORMAT()-functie .

Er zijn al meerdere antwoorden en opmaaktypen voor SQL-server.
Maar de meeste methoden zijn enigszins dubbelzinnig en het zou voor u moeilijk zijn om de getallen voor het formaattype of functies met betrekking tot het specifieke datumformaat te onthouden. Daarom is er in de volgende versies van SQL Server een betere optie.

FORMAT ( value, format [, culture ] )

Cultuuroptie is erg handig, omdat je de datum kunt specificeren volgens je kijkers.

Je moet d (voor kleine patronen) en D (voor lange patronen) onthouden.

1.”d” – Kort datumpatroon.

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” – Lange datumpatroon.

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)

Meer voorbeelden in zoekopdracht.

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?

Als u meer indelingen wilt, kunt u naar:

  1. Standaard tekenreeksen voor datum- en tijdnotatie
  2. Aangepaste tekenreeksen voor datum- en tijdnotatie

Antwoord 11

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

Antwoord 12

VLOER() gebruiken – verkort gewoon de tijd.

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

Antwoord 13

ALS je CONVERT wilt gebruiken en dezelfde output wilt krijgen als in de oorspronkelijke vraag, dat wil zeggen, jjjj-mm-dd, gebruik dan CONVERT(varchar(10),[SourceDate as dateTime],121) dezelfde code als het vorige paar antwoordt, maar de code die moet worden geconverteerd naar jjjj-mm-dd met streepjes is 121.

Als ik even op mijn zeepkist kan, dit soort opmaak hoort niet thuis in de datalaag, en daarom was het niet mogelijk zonder dwaze ‘trucjes’ met hoge overhead tot SQL Server 2008 toen de feitelijke datatypes voor datumdelen werden geïntroduceerd. Het maken van dergelijke conversies in de datalaag is een enorme verspilling van overhead op uw DBMS, maar wat nog belangrijker is, de tweede keer dat u zoiets doet, heeft u in feite verweesde gegevens in het geheugen gemaakt waarvan ik aanneem dat u daarna terugkeert naar een programma. Je kunt het niet terugzetten in een andere 3NF+-kolom of het vergelijken met iets getypt zonder terug te keren, dus alles wat je hebt gedaan is faalpunten geïntroduceerd en relationele verwijzingen verwijderd.

Je moet ALTIJD doorgaan en je dateTime-gegevenstype terugsturen naar het aanroepende programma en in de PRESENTATION-laag de nodige aanpassingen maken. Zodra je gaat converteren voordat u ze terugstuurt naar de beller, verwijdert u alle hoop op referentiële integriteit uit de toepassing. Dit zou opnieuw een UPDATE- of DELETE-bewerking voorkomen, tenzij u een soort van handmatige reversie uitvoert, waardoor uw gegevens opnieuw worden blootgesteld aan menselijke/code/gremlin-fouten wanneer dat niet nodig is.


Antwoord 14

SELECT DATEADD(DD, DATEDIFF(DD, 0, GETDATE()), 0)
SELECT DATEADD(DAY, 0, DATEDIFF(DAY,0, GETDATE()))
SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 101))

Bewerken: de eerste twee methoden zijn in wezen hetzelfde en voeren de methode converteren naar varchar uit.


Antwoord 15

Om het aangegeven resultaat te verkrijgen, gebruik ik de volgende opdracht.

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

Ik hoop dat het nuttig is.


Antwoord 16

 Convert(nvarchar(10), getdate(), 101) --->  5/12/14
 Convert(nvarchar(12), getdate(), 101) --->  5/12/2014

Antwoord 17

Als u de resultaten aan een kolom of variabele toewijst, geeft u deze het type DATE en de conversie is impliciet.

DECLARE @Date DATE = GETDATE()   
SELECT @Date   --> 2017-05-03

Antwoord 18

In dit geval, alleen de datum, gaan we deze zoekopdracht uitvoeren:

SELECT CONVERT(VARCHAR(10), getdate(), 111);voer hier de afbeeldingsbeschrijving in


Antwoord 19

Ik denk dat dit in jouw geval zou werken:

CONVERT(VARCHAR(10),Person.DateOfBirth,111) AS BirthDate
//here date is obtained as 1990/09/25

Antwoord 20

DECLARE @yourdate DATETIME = '11/1/2014 12:25pm'    
SELECT CONVERT(DATE, @yourdate)

Antwoord 21

Oké, hoewel ik een beetje laat ben :), Hier is de andere oplossing.

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

Resultaat

2008-09-22 00:00:00.000

En als u SQL Server 2012 en hoger gebruikt, kunt u de functie FORMAT() als volgt gebruiken –

SELECT FORMAT(GETDATE(), 'yyyy-MM-dd')

Antwoord 22

Datum:

SELECTEER CONVERTEREN(datum, GETDATUM())
SELECTEER CAST(GETDATE() als datum)

Tijd:

SELECTEER CONVERTEREN(tijd , GETDATUM() , 114)
SELECTEER CAST(GETDATE() als tijd)

Antwoord 23

Zelfs bij gebruik van de oude MSSQL Server 7.0, de code hier (met dank aan deze link) stelde me in staat om het datumformaat te krijgen dat ik op dat moment zocht:

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)

Het produceerde deze uitvoer:

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

Antwoord 24

Je kunt het gewoon op deze manier doen:

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

Uitvoer als:

2008-09-22 00:00:00.000

Of doe gewoon zo:

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

Resultaat:

Date Part Only
--------------
2013-07-14

Antwoord 25

Doe gewoon:

SELECT CAST(date_variable AS date)

of met met PostgreSQL:

SELECT date_variable::date


Antwoord 26

waarom gebruikt u DATE_FORMAT( uw_datetiem_column, ‘%d-%m-%Y’ ) niet?

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

je kunt de volgorde van m,d en jaar veranderen door het '%d-%m-%Y' gedeelte

te herschikken


Antwoord 27

Ik weet dat dit oud is, maar ik zie niet waar iemand het op deze manier heeft gezegd. Voor zover ik kan zien, is dit de ANSI-standaard.

SELECT CAST(CURRENT_TIMESTAMP AS DATE)

Het zou goed zijn als Microsoft ook de ANSI-standaard CURRENT_DATE-variabele zou kunnen ondersteunen.


Antwoord 28

Ik geef de voorkeur aan het volgende dat niet werd genoemd:

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

Het geeft ook niet om lokale of dubbele conversie — hoewel elk ‘datepart’ waarschijnlijk rekent. Dus het is misschien iets langzamer dan de datediff-methode, maar voor mij is het veel duidelijker. Vooral als ik alleen op jaar en maand wil groeperen (zet de dag op 1).


Antwoord 29

Vanaf SQL SERVER 2012 kunt u dit doen:

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


Antwoord 30

Op SQL Server 2000

CAST(
(
    STR( YEAR( GETDATE() ) ) + '/' +
    STR( MONTH( GETDATE() ) ) + '/' +
    STR( DAY( GETDATE() ) )
)
AS DATETIME)

LEAVE A REPLY

Please enter your comment!
Please enter your name here

14 − 4 =

Other episodes