Come restituire solo la data da un tipo di dati DateTime di SQL Server


1778
SELECT GETDATE()

Ritorna: 2008-09-22 15:24:13.790

Voglio quella parte di data senza la parte di tempo: 2008-09-22 00:00:00.000

Come posso ottenerlo?


4
Se stai cercando di ottenere un tipo di dati di data senza l'ora, anche se l'ora è 00:00:00, allora sei sfortunato, puoi ottenere un varchar ma la struttura è un datetime e avrai sempre un po 'di tempo.
Quintin Robinson,

16
Una cosa da notare è che SQL Server 2008 include un tipo di dati DATE separato per la memorizzazione di sole date senza il componente orario. Maggiori informazioni qui: sql-server-performance.com/articles/dev/datetime_2008_p1.aspx
Ben Hoffstein,

7
Non perdere questo post che mostra i risultati dei test delle prestazioni dei vari metodi di rimozione dei tempi.
ErikE

18
Non essere fuorviato dai voti e dalla risposta accettata, dai un'occhiata a stackoverflow.com/a/126984/1155650
Rohit Vipin Mathews,

8
@Rohit Assumi erroneamente che il 2008 sia l'unica versione a cui le persone tengono. (Esistono più versioni in natura.) I voti parlano da soli.
hktegner,

Risposte:


2487

A partire da SQL Server 2008, dovresti uscire CONVERTcon:

SELECT CONVERT(date, getdate())

Nelle versioni precedenti, è possibile effettuare le seguenti operazioni:

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

per esempio

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

mi da

2008-09-22 00:00:00.000

Professionisti:

  • Nessuna varchar<-> datetimeconversione richiesta
  • Non c'è bisogno di pensarci locale

Come suggerito da Michael

Usa questa variante: 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()))

Produzione:

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

52
+1 Sembra che questo sia il 35% più veloce del metodo double convert () comunemente usato (che ho usato anche per anni). Ben fatto.
Dane,

8
L'unico aspetto negativo che posso vedere alla tua soluzione è che se non sai cosa sta facendo è un po 'ottuso. L'uso del doppio metodo di conversione rende le tue intenzioni più ovvie per i futuri manutentori del codice. A proposito, non ti ho sottovalutato. Penso che inizierò a usare anche il tuo metodo. Grazie @aku
Jim Birchall,

38
@pilavdzice L'impostazione di un datetime alla mezzanotte di quel giorno non lasciare fuori IL TEMPO. Quale risultato ti aspetti? Il datetimetipo di dati non può avere tempo . Penso che tu stia confondendo la memorizzazione dei dati con la presentazione dell'utente. Se tutto ciò che vuoi è un modo per mostrare a un utente una stringa che non ha una porzione di tempo (non zero, solo spazi), allora semplicemente vuoi Convert(varchar(30), @Date, 101)o qualcosa di simile. Vedere la documentazione online di SQL Server • Trasmetti e converti per ulteriori informazioni.
ErikE

7
@ user1671639 il tipo di dati datetime contiene sempre sia una data che un'ora, non è possibile memorizzarne sensibilmente l'una senza l'altra, a meno che non si utilizzi SQL Server 2008, nel qual caso esistono anche dati "date" e "time" separati tipi. Se usi CONVERT () in questo modo, vuoi davvero una stringa per un uso successivo, quindi rimarrai bloccato a farlo in quel modo - anche se sarebbe meglio se usassi le funzioni di formattazione della data invece di tagliare la data - o via CAST(... AS DATE)o CONVERT(DATE, ...), che è stato menzionato abbastanza spesso in questa stessa pagina.
Magnus,

10
Raccomando di cambiare la risposta in SELECT DATEADD(dd, DATEDIFF(dd, 0, @your_date), 0)perché quindi ddpuò essere scambiato con qualsiasi altra datepartparola chiave per troncare il tuo datetimea livello arbitrario.
Michael - Dov'è Clay Shirky il

717

SQLServer 2008 ora ha un tipo di dati 'data' che contiene solo una data senza componente temporale. Chiunque utilizzi SQL Server 2008 e oltre può eseguire le seguenti operazioni:

SELECT CONVERT(date, GETDATE())

41
C'è anche il tipo di dati "time" in SQL2008 che risponde all'altra metà della domanda sulla separazione di data e ora.
misteraidan,

8
Cordiali saluti, ho confrontato diversi metodi di riduzione del tempo dalle date e questo è stato il metodo più veloce. Concesso che la differenza era piccola, ma era chiaramente più veloce su un gran numero di esecuzioni.
UnhandledExcepSean,

2
wt su sqlserver 2005 ??
Dr. MAF,

@ Dr.MAF completamento del cerchio, la risposta pre-2008 è qui: stackoverflow.com/questions/113045/...
Frosty840

170

Se si utilizza SQL 2008 e versioni successive:

select cast(getdate() as date)

3
@FredrickGauss: che tipo, data? Quale versione di SQL Server usi?
abatishchev,

7
Attenzione! dichiarare @ date1 datetime = '2015-09-30 20: 59: 59.999'; cast selezionato (@ data1 come data) restituisce '2015-10-01'
Nick,

6
@Nick: questo è il problema con DateTime. usa DateTime2invece e funziona benissimo. sqlfiddle.com/#!6/9eecb7/2833
abatishchev

8
@Nick, per integrare la risposta abatishchev, @ date1 lo è 2015-10-01, a causa delle DateTimelimitazioni. Prova senza alcun cast a Date, cede 2015-10-01anche! declare @date1 datetime = '2015-09-30 23:59:59.999';select @date1=>2015-10-01
Frédéric l'

4
Uno di questi trucchi SQL facili da ricordare. Come dice Mike, solo dal 2008 in poi ma, se trovi un DB del 2005 e precedente da qualche parte, potresti avere molti problemi :)
NicVerAZ,

73

DATEADD e DATEDIFF sono meglio di CONVERTING su varchar. Entrambe le query hanno lo stesso piano di esecuzione, ma i piani di esecuzione riguardano principalmente le strategie di accesso ai dati e non rivelano sempre i costi impliciti associati al tempo impiegato dalla CPU per eseguire tutti i pezzi. Se entrambe le query vengono eseguite su una tabella con milioni di righe, il tempo CPU utilizzando DateDiff può essere vicino a 1/3 del tempo Converti CPU!

Per visualizzare i piani di esecuzione per le query:

set showplan_text on
GO 

Sia DATEADD che DATEDIFF eseguiranno CONVERT_IMPLICIT.

Sebbene la soluzione CONVERT sia più semplice e più facile da leggere per alcuni, è più lenta. Non è necessario eseguire il cast al datetime (ciò è implicitamente fatto dal server). Non è inoltre necessario il metodo DateDiff per DateAdd in seguito, poiché anche il risultato intero verrà convertito in modo implicito in datetime.


SELEZIONA CONVERT (varchar, MyDate, 101) FROM DatesTable

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

SELEZIONA DATEADD (gg, 0, DATEDIFF (gg, 0, MyDate)) DA DateTabella

  |--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]))

L'uso di FLOOR () come suggerito da @digi ha prestazioni più vicine a DateDiff, ma non è consigliabile poiché il cast del tipo di dati datetime su float e back non sempre restituisce il valore originale.

Ricorda ragazzi: non credete a nessuno. Guarda le statistiche sulle prestazioni e provale tu stesso!

Fai attenzione quando collaudi i tuoi risultati. La selezione di più righe per il client nasconderà la differenza di prestazioni perché impiega più tempo a inviare le righe sulla rete di quanto non faccia per eseguire i calcoli. Quindi assicurati che il lavoro per tutte le righe sia svolto dal server ma che non ci siano set di righe inviati al client.

Sembra esserci confusione per alcune persone su quando l'ottimizzazione della cache influisce sulle query. L'esecuzione di due query nello stesso batch o in batch separati non ha alcun effetto sulla memorizzazione nella cache. Quindi puoi far scadere la cache manualmente o semplicemente eseguire le query avanti e indietro più volte. Qualsiasi ottimizzazione per la query n. 2 influirebbe anche su eventuali query successive, quindi se lo desideri, esegui l'esecuzione n.

Ecco lo script di test completo e i risultati delle prestazioni che dimostrano che DateDiff è sostanzialmente più veloce rispetto alla conversione in varchar.


Ricardo C, bella indagine! Quale versione di SQL Server usi? Su MSSQL2000 il metodo con Dateiff ha prestazioni leggermente più veloci per me.
Aku,

Solo per notare, ho eseguito il test 1000.000 volte. Per gli scenari del mondo reale, la differenza di prestazioni non sarà evidente, immagino
aku

Aku, ho usato SQL Server 2005 Express per questo test. Lavoro sul 2000 al lavoro e lo proverò con una tabella con oltre 24 milioni di righe e vedrò cosa ne esce.
Ricardo C,

Aku, stessi risultati. Nessuna differenza nelle prestazioni su dieci milioni di righe.
Ricardo C,

5
Le affermazioni sulla parità di prestazioni non sono vere. Naturalmente i piani di esecuzione saranno gli stessi !!! La misurazione delle prestazioni su questi DEVE essere effettuata confrontando l'utilizzo della CPU, non esaminando i piani di esecuzione.
ErikE,

51

Prova questo:

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

La suddetta dichiarazione converte il formato corrente in YYYY/MM/DD, fare riferimento a questo collegamento per scegliere il formato preferibile.


5
Questo restituisce "2008/09/22" per me
eddiegroves,

1
SELEZIONA CONVERT (VARCHAR (10), GETDATE (), 101) è il mm/dd/yyyyformato.
Pulce,

4
se stai ordinando in base al valore di testo non
elaborato

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

21

Per tornare in formato data

CAST (Data ordine Data AS)

Il codice sopra funzionerà in SQL Server 2010

Tornerà come il 12/12/2013

Per SQL Server 2012 utilizzare il codice seguente

CONVERT(VARCHAR(10), OrderDate , 111)

1
Questo mi restituisce la data con zero volte, non solo la data
Bohemian

1
posso sapere quale versione se stai usando SQL Server?
Mahesh ML

1
@MaheshML restituisce sia la data che l'ora in MS SQL 2012.
Marek,

1
Funziona come un incantesimo in SQL Azure
Martín Coll

5
@MaheshML Non esiste SQL Server 2010.
SvenAelterman,


16

Se hai bisogno del risultato come a varchar, dovresti passare attraverso

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

che è già menzionato sopra.

Se hai bisogno di risultati nel formato di data e ora, dovresti usare una qualsiasi delle domande qui sotto

  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


14
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

13

Usando FLOOR () - basta tagliare la parte del tempo.

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

4
Questo metodo non è il più veloce e insegna anche implicitamente alla gente che lanciare le date per fluttuare è accurato, cosa che non lo è. Si prega di consultare questo post per maggiori dettagli.
ErikE,

13

Se si utilizza SQL Server 2012 o versioni successive ,

Usa la Format()funzione.

Esistono già più risposte e tipi di formattazione per il server SQL. Ma la maggior parte dei metodi sono in qualche modo ambigui e sarebbe difficile ricordare i numeri per tipo di formato o funzioni rispetto al Formato data specifico. Ecco perché nelle prossime versioni di SQL Server c'è un'opzione migliore.

FORMAT ( value, format [, culture ] )

L'opzione Cultura è molto utile, poiché puoi specificare la data secondo i tuoi spettatori.

Devi ricordare d (per motivi piccoli) e D (per motivi lunghi).

1. "d" - modello di data breve.

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" - Modello di data lunga.

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)

Altri esempi in query.

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        2011101

Se vuoi più formati, puoi andare a:

  1. Stringhe di formato di data e ora standard
  2. Stringhe di formato di data e ora personalizzate

12

Se si desidera utilizzare CONVERT e ottenere lo stesso output della domanda originale posta, ovvero yyyy-mm-dd, utilizzare lo CONVERT(varchar(10),[SourceDate as dateTime],121)stesso codice della risposta della coppia precedente, ma il codice da convertire in yyyy-mm-dd con trattini è 121.

Se riesco ad accedere al mio soapbox per un secondo, questo tipo di formattazione non appartiene al livello dei dati , ed è per questo che non è stato possibile senza "trucchi" stupidi per le spese generali fino a SQL Server 2008 quando i tipi di dati di datepart effettivi sono introdotto. Effettuare tali conversioni nel livello dati è un enorme spreco di sovraccarico per il tuo DBMS, ma ancora più importante, nel momento in cui fai qualcosa del genere, hai praticamente creato dati orfani in memoria che presumo che tornerai a un programma. Non è possibile rimetterlo in un'altra colonna 3NF + o confrontarlo con qualsiasi cosa digitata senza ripristinare, quindi tutto ciò che hai fatto è stato introdotto punti di errore e rimosso il riferimento relazionale.

Dovresti SEMPRE andare avanti e restituire il tipo di dati dateTime al programma chiamante e, nel livello PRESENTAZIONE, apportare le modifiche necessarie. Non appena vai a convertire le cose prima di restituirle al chiamante, rimuovi tutte le speranze di integrità referenziale dall'applicazione. Ciò impedirebbe di nuovo un'operazione di AGGIORNAMENTO o ELIMINAZIONE, a meno che non si esegua una sorta di inversione manuale, che espone nuovamente i dati all'errore umano / code / gremlin quando non è necessario.


1
Tranne, ad esempio, se si desidera una query che recuperi tutti i record corrispondenti a una data fornita dall'utente come parte della data di un determinato campo orario. Buona fortuna farlo solo nel livello di presentazione. (Non è necessario convertire, è possibile utilizzare l'aritmetica della data, ma si ottiene l'idea ...)
Andrew Lazarus

1
@Andrew perché è importante? Dici: WHERE col >= @Date AND col < DATEADD(DAY, 1, @Date);non c'è assolutamente alcun motivo per perdere tempo dalla colonna.
Aaron Bertrand,

1
@AaronBertrand Funziona solo supponendo che l'input @Dateabbia una parte temporale zero. Nel caso in cui ciò non sia vero, devi comunque sapere come troncare i tempi sul lato server. Sono d'accordo con questa risposta che la formattazione dovrebbe essere lasciata al livello di presentazione, ma non sono d'accordo con l'implicazione che lasciare che per il front-end significhi che non devi conoscere un modo rapido per troncare.
Andrew Lazarus,

1
@Andrew non devi fare altro che impostare il parametro di input DATE. Il mio punto è ancora che non dovresti mai applicare tale troncamento alla colonna , anche se questo è il primo istinto della maggior parte delle persone.
Aaron Bertrand,

1
@AaronBertrand e presuppone che tu abbia il controllo sul tipo di dati del parametro. Va bene in una procedura memorizzata, non così possibile in altre situazioni. Perché non eseguire il cast per essere sicuri che il parametro sia il tipo desiderato e necessario?
Andrew Lazarus,

10
SELECT DATEADD(DD, DATEDIFF(DD, 0, GETDATE()), 0)

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

SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 101))

Modifica: i primi due metodi sono essenzialmente gli stessi e out esegue il metodo convert in varchar.


1
Questi metodi sono tutti fantastici, ma quale suggerisci di usare?
eddiegroves,

3
Si noti che la versione "corretta" dei primi due è select dateadd(dd, datediff(dd, 0, getdate()), 0), perché le dds possono poi essere scambiati per una qualsiasi delle le datepartparole chiave per ritagliare la data in qualsiasi segmento che si sceglie. (Nota anche che ddè solo un'abbreviazione per day.)
Michael - Dov'è Clay Shirky il

10

Per ottenere il risultato indicato, utilizzo il seguente comando.

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

Lo olpe è utile.


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

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

7

Se stai assegnando i risultati a una colonna o variabile, assegnagli il tipo DATA e la conversione è implicita.

DECLARE @Date DATE = GETDATE()   

SELECT @Date   --> 2017-05-03

6

Penso che funzionerebbe nel tuo caso:

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

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

2
Questo suggerimento è stato coperto da altre risposte (più di una volta).
Andriy M

6

Ok, anche se sono un po 'in ritardo :), ecco un'altra soluzione.

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

Risultato

2008-09-22 00:00:00.000

E se si utilizza SQL Server 2012 e versioni successive, è possibile utilizzare la FORMAT()funzione in questo modo -

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

Il tuo primo esempio ha ancora una componente temporale. Il punto della domanda era come rimuoverlo.
Zack,

5

Anche usando l'antico MSSQL Server 7.0, il codice qui (per gentile concessione di questo link ) mi ha permesso di ottenere qualunque formato di data stavo cercando in quel momento:

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)

Ha prodotto questo output:

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

5

Data:

SELEZIONA CONVERT (data, GETDATE ())
SELEZIONA CAST (GETDATE () come data)

Tempo:

SELEZIONA CONVERT (ora, GETDATE (), 114)
SELEZIONA CAST (GETDATE () come ora)

5

Semplicemente puoi fare così:

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

Uscite come:

2008-09-22 00:00:00.000

O semplicemente fai così:

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

Risultato:

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

4

perché non usi DATE_FORMAT (your_datetiem_column, '% d-% m-% Y')?

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

è possibile modificare la sequenza di m, d e l'anno riordinando la '%d-%m-%Y'parte


4

So che questo è vecchio, ma non vedo dove qualcuno lo abbia affermato in questo modo. Da quello che posso dire, questo è lo standard ANSI.

SELECT CAST(CURRENT_TIMESTAMP AS DATE)

Sarebbe positivo se Microsoft potesse supportare anche la variabile CURRENT_DATE standard ANSI.


select {fn current_date()} as todayper me va bene.
brianary

@brianary - È carino, ma non è ANSI SQL.
acceso l'

È abbastanza giusto, e la tua risposta è piacevolmente portatile, ma ho pensato che fintanto che stiamo lavorando su T-SQL, anche questo funziona (e dimostra che implementare ANSI CURRENT_DATE sarebbe banale per MS).
brianary

4

Prediligo quanto segue che non è stato menzionato:

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

Inoltre, non si preoccupa del locale o non esegue una doppia conversione, anche se ogni 'datepart' probabilmente fa matematica. Quindi potrebbe essere un po 'più lento del metodo datiff, ma per me è molto più chiaro. Soprattutto quando voglio raggruppare solo l'anno e il mese (impostare il giorno su 1).


4

A partire da SQL SERVER 2012, è possibile effettuare questa operazione:

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


4

Su SQL Server 2000

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


3

È possibile utilizzare quanto segue per la parte della data e la formattazione della data:

DATENAME => Restituisce una stringa di caratteri che rappresenta la parte data specificata della data specificata

DATEADD => La DATEPART()funzione viene utilizzata per restituire una singola parte di una data / ora, come anno, mese, giorno, ora, minuti, ecc.

DATEPART => Restituisce un numero intero che rappresenta la parte specificata della data specificata.

CONVERT()=> La CONVERT()funzione è una funzione generale che converte un'espressione di un tipo di dati in un altro. La CONVERT()funzione può essere utilizzata per visualizzare i dati di data / ora in diversi formati.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.