Il miglior approccio per rimuovere parte del tempo di datetime in SQL Server


514

Quale metodo offre le migliori prestazioni quando si rimuove la porzione di tempo da un campo datetime in SQL Server?

a) select DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)

o

b) select cast(convert(char(11), getdate(), 113) as datetime)

Il secondo metodo invia alcuni byte in più in entrambi i modi, ma potrebbe non essere importante quanto la velocità della conversione.

Entrambi sembrano essere molto veloci, ma potrebbe esserci una differenza di velocità quando si affrontano centinaia di migliaia o più righe?

Inoltre, è possibile che ci siano metodi ancora migliori per sbarazzarsi della porzione di tempo di un datetime in SQL?


1
Ho provato questo su un milione di dischi in una delle mie tabelle di produzione e non sono riuscito a ottenere una lettura accurata delle prestazioni in entrambi i casi. Entrambi i metodi hanno comunque restituito la stessa identica quantità di dati.
Stephen Perelson,

9
Su 18.000.000 di righe questo è quello che ho trovato (SQL Server 2008): il metodo b è più lento di circa il 24% rispetto al metodo a. CAST (FLOOR (CAST (getdate () AS FLOAT)) COME DATETIME) è più lento del 3,5% rispetto al metodo a. Il metodo a sembra essere un vincitore per quanto riguarda le prestazioni. Grazie a tutti per le ottime risposte.
Stephen Perelson,

46
Perché diamine SQL non ha una funzione integrata per farlo comunque? !!
Gary McGill,

10
Il nuovo tipo di dati DATE di SQL 2008 gestirà questo.
Philip Kelley,

Risposte:


558

Rigorosamente, il metodo richiede ameno risorse:

a) select DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)

Dimostrato meno utilizzo della CPU per la stessa durata totale di un milione di righe da parte di qualcuno con troppo tempo a disposizione: il modo più efficiente in SQL Server per ottenere la data da data + ora?

Ho visto un test simile altrove con risultati simili.

Preferisco il DATEADD / DATEDIFF perché:

Modifica, ottobre 2011

Per SQL Server 2008+, è possibile eseguire il CAST su dateie CAST(getdate() AS date). O semplicemente usa il datetipo di dati, quindi non c'è tempo per rimuoverlo.

Modifica, gennaio 2012

Un esempio esaustivo di quanto sia flessibile: è necessario calcolare in base al tempo arrotondato o alla data nel server sql

Modifica, maggio 2012

Non utilizzarlo nelle clausole WHERE e simili senza pensare: l'aggiunta di una funzione o CAST a una colonna invalida l'utilizzo dell'indice. Vedi il numero 2 qui: http://www.simple-talk.com/sql/t-sql-programming/ten-common-sql-programming-mistakes/

Ora, questo ha un esempio di versioni successive dell'ottimizzatore di SQL Server che gestiscono correttamente CAST fino ad oggi, ma generalmente sarà una cattiva idea ...

Modifica, settembre 2018, per datetime2

DECLARE @datetime2value datetime2 = '02180912 11:45' --this is deliberately within datetime2, year 0218
DECLARE @datetime2epoch datetime2 = '19000101'

select DATEADD(dd, DATEDIFF(dd, @datetime2epoch, @datetime2value), @datetime2epoch)

3
@David Sopko per la modifica dell'ottobre 2011, quindi il codice sarebbe: seleziona cast (GETDATE () come data)
Choco Smith,

1
Per le versioni più recenti di SQL, l'utilizzo di date anziché datetime evita la necessità di gestire le ore. Utilizzare il seguente esempio: dichiarare noTime date = getdate (), withTime datetime = getdate () selezionare @ noTime, @ withTime
ozkary

1
il cast come data è fantastico se hai solo bisogno della data. Tuttavia, spesso è necessaria la data corrente a mezzanotte, quindi è possibile eseguire ulteriori manipolazioni della data. l' DATEora dei dati è odiosamente restrittiva rispetto a ciò che ti permetterà di fare riguardo a cose come dateadd, dateiff e l'interazione con altri tipi di dati data / ora. In questi casi, l' DATEADD()approccio regna sovrano.
Xedni,

Questo non funziona per ogni data. Sono entrato per errore 0218invece che 2018come l'anno e la DATEDIFFparte della tua dichiarazione genera un'eccezione The conversion of a datetime2 data type to a datetime data type resulted in an out-of-range datetime valueProva:select DATEDIFF(dd, 0, convert(datetime2(0), '0218-09-12', 120))
Bernhard Döbler,

1
@ BernhardDöbler nel luglio 2009, quando ho risposto, "0218" sarebbe stata una data valida, quindi non avresti ottenuto così lontano. Inoltre, lo "0" non viene convertito in 19000101 per datetime2. Prova questa selezioneSELECT DATEDIFF(dd, '19000101', convert(datetime2(0), '0218-09-12', 120))
gbn

69

In SQL Server 2008 è possibile utilizzare:

CONVERT(DATE, getdate(), 101)

13
Il terzo argomento non ha assolutamente alcun effetto sul risultato quando si converte da a datetimein a date, quindi la soluzione si riduce effettivamente a just CONVERT(DATE,getdate()), il che è già stato suggerito più di una volta.
Andriy M,

Basta usare CAST(GETDATE() AS DATE)o rigorosamente ANSI CAST(CURRENT_TIMESTAMP AS DATE)che ritengo inutile. Resta con il primo.
Ivanzinho,

52

Naturalmente questo è un vecchio thread ma per completarlo.

Da SQL 2008 è possibile utilizzare il tipo di dati DATE in modo da poter semplicemente fare:

SELECT CONVERT(DATE,GETDATE())

21
SELECT CAST(FLOOR(CAST(getdate() AS FLOAT)) AS DATETIME)

... non è una buona soluzione, per i commenti qui sotto.

Vorrei eliminare questa risposta, ma la lascerò qui come controesempio poiché ritengo che la spiegazione dei commentatori sul perché non sia una buona idea sia ancora utile.


Vedi la risposta di GBN, molti hanno studiato questo. I DATETIMI NON sono memorizzati come float, quindi l'uso di DATEADD / DATEDIFF evita la manipolazione matematica necessaria per CAST tra i tipi.
MatBailie,

Posso accettare che potresti voler evitare un cast da DATETIME a FLOAT per il motivo che descrivi, ma in quel caso la conversione implicita da zero nell'opzione OP (a) è anche un problema? Hmmm ... Suppongo che in quel caso non sia un FLOAT e che il server sia probabilmente abbastanza intelligente da scartare le informazioni sul tempo. OK, ammetto :-)
Gary McGill

Lo 0 è in effetti una conversione implicita da un tipo numerico (INT immagino) in un DATETIME. Poiché è un'espressione costante, tuttavia, l'ottimizzatore può farlo in fase di compilazione per Stored Procedure e deve eseguirlo una sola volta per eseguire dinamicamente SQL. In breve, c'è un overhead una volta per quello, la query basata su FLOAT ha l'overhead equivalente per ogni riga.
MatBailie,

Il casting su float è terribilmente impreciso. Questa risposta dovrebbe essere cancellata. Nessuno dovrebbe usare questo codice.
usr

3
Per non parlare del fatto che non è sicuro eseguire il cast su float e tornare al datetime - float non ha abbastanza precisione. Pertanto penso che non possa essere affatto raccomandato. Vedi questo post per maggiori dettagli .
ErikE

17

In SQL Server 2008 esiste un tipo di dati DATE (anche un tipo di dati TIME).

CAST(GetDate() as DATE)

o

declare @Dt as DATE = GetDate()

Questo è quello che ho usato e ha funzionato bene. Sembra la risposta più semplice. Qualche svantaggio rispetto all'uso in combinazione con CONVERT?
Joelmdev,

1
CAST e CONVERT hanno funzioni equivalenti. La differenza è che CAST fa parte dello standard ANSI, mentre CONVERT è specifico per T-SQL. Quindi, usa CAST dove possibile.
troy,

@troy Uso CAST perché posso salvare 3 lettere digitanti e la sintassi è più chiara di CONVERT, la parte ANSI Standard è inutile
Ivanzinho,

8

Ecco un'altra risposta, da un'altra domanda duplicata:

SELECT CAST(CAST(getutcdate() - 0.50000004 AS int) AS datetime) 

Questo metodo di numeri magici si comporta leggermente più velocemente del metodo DATEADD. (Sembra ~ 10%)

Il tempo della CPU su diversi round di un milione di record:

DATEADD   MAGIC FLOAT
500       453
453       360
375       375
406       360

Ma nota che questi numeri sono probabilmente irrilevanti perché sono già MOLTO veloci. A meno che non avessi set di record di 100.000 o più, non riuscivo nemmeno a leggere il Tempo CPU sopra lo zero.

Considerando il fatto che DateAdd è pensato per questo scopo ed è più robusto, direi che usi DateAdd.


1
È orribile. Non metterei mai a rischio i miei dati in questo modo. Chissà se questo è corretto per tutti i tempi , non solo quelli che hai testato.
usr

@usr Oh, è corretto, è solo un numero magico e non dovrebbe essere usato per questo motivo. Se vuoi verificarne la correttezza, inserisci tutte le date possibili per un giorno in una tabella e controlla i risultati! Vedi anche questo post per ulteriori informazioni.
ErikE

@ErikE buon punto. La tua risposta offre la possibilità di utilizzare '12:00:00.003'ciò che penso sia molto meglio, però.
usr

6
SELECT CAST(CAST(GETDATE() AS DATE) AS DATETIME)

4
Un'opzione valida, sì. Suggerito più di una volta in questa discussione, però.
Andriy M,

Onestamente, questa soluzione è la più facile da leggere. My goto
BelgoCanadian

5

Mi piace molto:

[date] = CONVERT(VARCHAR(10), GETDATE(), 120)

Il 120codice del formato forzerà la data nello standard ISO 8601:

'YYYY-MM-DD' or '2017-01-09'

Super facile da usare in dplyr ( R) e Panda ( Python)!


3

ATTENZIONE!

Il metodo a) eb) NON ha sempre lo stesso output!

select DATEADD(dd, DATEDIFF(dd, 0, '2013-12-31 23:59:59.999'), 0)

Produzione: 2014-01-01 00:00:00.000

select cast(convert(char(11), '2013-12-31 23:59:59.999', 113) as datetime)

Produzione: 2013-12-31 00:00:00.000

(Testato su MS SQL Server 2005 e 2008 R2)

EDIT: Secondo il commento di Adam, questo non può accadere se leggi il valore della data dalla tabella, ma può accadere se fornisci il valore della tua data come un valore letterale (esempio: come parametro di una procedura memorizzata chiamata via ADO.NET).


1
.999 non può essere archiviato in SQL Server in una DATETIMEcolonna. Il più alto è a disposizione 0,997 Da: msdn.microsoft.com/en-us/library/ms187819.aspx~~V~~singular~~2nd vedrete che i valori sono arrotondate per avere il posto millesima a 0, 3, o 7. Il PO non vedrà il valore del tuo test nelle loro tabelle.
Adam Wenger,

Hai ragione. Non intendevo pubblicare questo come una risposta alla domanda del PO, ma come un commento per gli altri, ma avevo solo 11 punti reputazione e 15 sono necessari per commentare.
broslav,

Nel tuo primo frammento la costante di stringa viene convertita implicitamente in un datetime, nel secondo rimane una stringa (e il 113 viene semplicemente ignorato).
Andriy M,

2

In primo luogo, ridurre il tempo sugli inserti / gli aggiornamenti. Per quanto riguarda la conversione al volo, nulla può battere una funzione definita dall'utente in termini di manutenzione:

select date_only(dd)

L'implementazione di date_onlypuò essere qualsiasi cosa ti piaccia - ora è stata sottratta e il codice chiamante è molto più pulito.


Una volta ho escogitato un grilletto per cancellare i tempi dalle colonne selezionate. Se i dati non possono essere dannosi, non è necessario pulirli.
Philip Kelley,

2
C'è un aspetto negativo nell'approccio UDF, non sono SARGable. Se utilizzato nelle clausole JOINs o WHERE, l'ottimizzatore non può utilizzare INDEX per migliorare le prestazioni. L'uso dell'approccio DATEADD / DATEDIFF, tuttavia, è SARGable e potrà beneficiare degli INDEX. (Apparentemente anche il metodo FLOAT è SARGable)
MatBailie,

1
@MatBailie Mi permetto di dissentire! Gli UDF non sono sicuramente SARGable, ma né Dateadd né Convert in float! WHERE DateAdd(DateDiff(Column)) = @DateValuenon utilizzerà un indice. D'altra parte, WHERE Column >= dbo.UDF(@DateValue) AND Column < dbo.UDF(@DateValue + 1) è SARGable. Quindi fai attenzione a come lo metti.
ErikE

2

Vedi questa domanda:
Come posso troncare un datetime in SQL Server?

Qualunque cosa tu faccia, non usare il metodo stringa . Questo è il modo peggiore in cui potresti farlo.


Grazie, ho pensato che questo doveva essere stato chiesto prima. Strano però che i miei esperimenti abbiano sottolineato che il metodo float è in realtà più lento del 3,5% su SQL Server 2008 rispetto al metodo dateadd (dd, 0, dateiff (dd, 0, getDate ())). Ho eseguito i test più volte per ciascun metodo e il server di database non era utilizzato per nessun altro al momento.
Stephen Perelson,

Diciamo solo che sono scettico nei confronti dei benchmark fatti da chiunque non abbia dimostrato di fare benchmark regolarmente e in modo molto scientifico come parte del loro lavoro. Anche il benchmark di Thomas nel link di gbn ha alcuni ovvi problemi quando lo guardi. Questo non lo rende necessariamente sbagliato, ma non definitivo. Il metodo cast / floor / cast è stato il modo più veloce accettato per molto tempo, e sospetto che una volta fosse indiscutibilmente vero. Detto questo, sto iniziando a riconsiderarlo; soprattutto per SQL Server 2008, dove comunque è completamente inutile.
Joel Coehoorn,

1
Il metodo stringa è estremamente facile da usare, da leggere e da ricordare. Questi sono fattori molto importanti che penso tu stia sottovalutando!
Ben

1
@JoelCoehoorn, lo stile di conversione 121 è chiamato "ODBC Canonical". Non varia con regole di confronto o impostazioni internazionali. Il trucco con le stringhe è anche facile da generalizzare per anno, anno + mese, giorno, ora o minuti.
Ben

1
@Ben Il trucco delle stringhe insegna agli sviluppatori a usare le conversioni di stringa. Essi lavorano , ma data la matematica è di gran lunga, di gran lunga superiore, per molte ragioni, non ultimo dei quali è la velocità - ma ancora di più, per ciò che imparare a lavorare con le date-as-numeri conferisce lo sviluppatore e le sue capacità mentali a essere fluidi con la manipolazione dei numeri nel codice.
ErikE

2

Ho già risposto, ma lo ammetterò anche là ... anche questo si preforma bene, ma funziona eliminando il decimale (che memorizza il tempo) dal float e restituendo solo una parte intera (che è la data)

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

la seconda volta che ho trovato questa soluzione ... ho preso questo codice


1
La conversione in float non è sicura .
ErikE

2
CAST(round(cast(getdate()as real),0,1) AS datetime)

Questo metodo non utilizza la funzione stringa. Dateè fondamentalmente un tipo di dati reale con cifre prima che i decimali siano la frazione di un giorno.

questo immagino sarà più veloce di molto.


1
Casting come float non è sicuro .
ErikE


2

seleziona CONVERT (char (10), GetDate (), 126)


Qual è la differenza principale del tuo suggerimento dal metodo menzionato nella risposta di @ broslav o dal metodo che è stato determinato come più lento in questo thread (stesso link come nella risposta accettata)?
Andriy M,

1

Penso che tu intenda cast(floor(cast(getdate()as float))as datetime)

real è solo a 32 bit e potrebbe perdere alcune informazioni

Questo è il più veloce cast(cast(getdate()+x-0.5 as int)as datetime)

... anche se solo circa il 10% più veloce(about 0.49 microseconds CPU vs. 0.58)

Questo è stato raccomandato e richiede lo stesso tempo nel mio test proprio ora: DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)

In SQL 2008, la funzione CLR di SQL è circa 5 volte più veloce rispetto all'utilizzo di una funzione SQL, a 1,35 microsecondi rispetto a 6,5 ​​microsecuzioni, indicando un overhead di chiamata di funzione molto più basso per una funzione CLR SQL rispetto a un semplice UDF SQL.

In SQL 2005, la funzione CLR di SQL è 16 volte più veloce, secondo i miei test, rispetto a questa funzione lenta:

create function dateonly (  @dt datetime )
returns datetime
as
begin
return cast(floor(cast(@dt as float))as int)
end

1

Che ne dici select cast(cast my_datetime_field as date) as datetime)? Ciò si traduce nella stessa data, con l'ora impostata su 00:00, ma evita qualsiasi conversione in testo ed evita anche qualsiasi arrotondamento numerico esplicito.



Non sono gli stessi. Le altre risposte hanno suggerito di lanciarlo in una data senza componente temporale e lasciarlo così. La mia pubblicazione lo imposta su un datetime con l'ora a mezzanotte. C'è una grande differenza; prova a esportare in MS Excel e vedrai che gestisce il datetime molto meglio della data.
Dr. Drew,

Il primo è esattamente lo stesso.
Mikael Eriksson,

Ok, sì, lo vedo adesso. Sarò felice di rimuovere la mia risposta come duplicato, se necessario.
Dr. Drew,

1

Penso che se ti attieni rigorosamente a TSQLquesto è il modo più veloce per troncare il tempo:

 select convert(datetime,convert(int,convert(float,[Modified])))

Ho trovato questo metodo di troncamento più veloce di circa il 5% rispetto al DateAddmetodo. E questo può essere facilmente modificato per arrotondare al giorno più vicino in questo modo:

select convert(datetime,ROUND(convert(float,[Modified]),0))

La conversione in float non è sicura .
ErikE

1

Qui ho creato una funzione per rimuovere alcune parti di un datetime per SQL Server. Uso:

  • Il primo parametro è il datetime da rimuovere.
  • Il secondo parametro è un carattere:
    • s: round a secondi; rimuove i millisecondi
    • m: giri a minuti; rimuove secondi e millisecondi
    • h: round a ore; rimuove minuti, secondi e millisecondi.
    • d: giri a giorni; rimuove ore, minuti, secondi e millisecondi.
  • Restituisce il nuovo datetime

create function dbo.uf_RoundDateTime(@dt as datetime, @part as char) returns datetime as begin if CHARINDEX( @part, 'smhd',0) = 0 return @dt; return cast( Case @part when 's' then convert(varchar(19), @dt, 126) when 'm' then convert(varchar(17), @dt, 126) + '00' when 'h' then convert(varchar(14), @dt, 126) + '00:00' when 'd' then convert(varchar(14), @dt, 112) end as datetime ) end


Grazie Andriy! Non sapevo che la mia raccomandazione non fosse così efficiente. Almeno funziona, ma hai ragione.
Max Vargas,

1

Nel caso in cui qualcuno stia cercando una versione di Sybase poiché molte delle versioni precedenti non hanno funzionato

CAST(CONVERT(DATE,GETDATE(),103) AS DATETIME)
  • Testato in I SQL v11 in esecuzione su Adaptive Server 15.7

Questo si adatta meglio come modifica alla risposta accettata. Con altre 20 risposte questo sarà seppellito e quasi insindacabile. Anche la risposta accettata menziona l'uso di cast: Per SQL Server 2008+, è possibile eseguire il CAST fino ad oggi. O semplicemente usa la data, quindi non c'è tempo per rimuovere.
EWit

Sarebbe meglio pubblicare questo come risposta a una domanda Sybase equivalente. Se non ci sono domande del genere, sei libero di crearne una (e rispondere da solo).
Andriy M,

Inoltre, è inutile specificare un terzo parametro in CONVERT quando si converte un datetimein date: nessuno di questi ha un formato intrinseco.
Andriy M,

0

Se possibile, per cose speciali come questa, mi piace usare le funzioni CLR.

In questo caso:

[Microsoft.SqlServer.Server.SqlFunction]
    public static SqlDateTime DateOnly(SqlDateTime input)
    {
        if (!input.IsNull)
        {
            SqlDateTime dt = new SqlDateTime(input.Value.Year, input.Value.Month, input.Value.Day, 0, 0, 0);

            return dt;
        }
        else
            return SqlDateTime.Null;
    }

0

Personalmente, uso quasi sempre le funzioni definite dall'utente per questo se ho a che fare con SQL Server 2005 (o versione precedente), tuttavia, va notato che ci sono degli svantaggi specifici nell'uso di UDF, specialmente se applicati alle clausole WHERE (vedi sotto e i commenti su questa risposta per ulteriori dettagli). Se si utilizza SQL Server 2008 (o versioni successive), vedere di seguito.

In effetti, per la maggior parte dei database che creo, aggiungo questi UDF proprio all'inizio, poiché so che prima o poi ne avrò bisogno al 99%.

Ne creo uno per "solo data" e "solo tempo" (anche se quello "solo data" è di gran lunga il più utilizzato dei due).

Ecco alcuni link a una varietà di UDF relativi alla data:

Funzioni essenziali per data, ora e data di SQL Server Funzione
get only date

L'ultimo link mostra non meno di 3 modi diversi per ottenere la data solo parte di un campo datetime e menziona alcuni pro e contro di ogni approccio.

Se si utilizza un UDF, si dovrebbe notare che si dovrebbe cercare di evitare di utilizzare l'UDF come parte di una clausola WHERE in una query poiché ciò ostacolerebbe notevolmente le prestazioni della query. Il motivo principale di ciò è che l'utilizzo di un UDF in una clausola WHERE rende tale clausola come non eseguibile , il che significa che SQL Server non può più utilizzare un indice con quella clausola al fine di migliorare la velocità di esecuzione della query. Con riferimento al mio uso personale di UDF, userò spesso la colonna della data "non elaborata" all'interno della clausola WHERE, ma applicherò l'UDF alla colonna SELECT. In questo modo, l'UDF viene applicato solo al set di risultati filtrati e non a tutte le righe della tabella come parte del filtro.

Naturalmente, l' approccio migliore in assoluto per questo è utilizzare SQL Server 2008 (o versioni successive) e separare le date e gli orari , poiché il motore di database di SQL Server fornisce quindi in modo nativo i singoli componenti di data e ora e può interrogarli in modo efficiente in modo indipendente senza la necessità di un UDF o altro meccanismo per estrarre la parte di data o ora da un tipo di data e ora composito.


L'uso di un UDF può essere utile in alcune situazioni (come quando si lavano i parametri). Ma nella maggior parte dei casi è una soluzione terribile : eseguire un UDF una volta per ogni riga è un modo per uccidere semplicemente le prestazioni di una query, senza che sia necessario!
ErikE

@ErikE - Non sono in disaccordo, Erik, UDF sono dei killer delle prestazioni, motivo per cui dico che, se puoi usare SQL Server 2008 o versioni successive e utilizzare un tipo di dati incorporato che fa questo per te, questa sarà la soluzione migliore (sia in termini di raggiungimento di ciò che è richiesto sia in termini di prestazioni). Se sei bloccato con una versione precedente di SQL Server che non lo supporta nativamente, rinuncerai a qualcosa per soddisfare i tuoi requisiti.
CraigTP

Vero. Sarebbe bello se il motore di database ci fornisse qualcosa di SARGable, ma più facile da esprimere. Nel frattempo, se siete alla ricerca di un valore che è in qualsiasi momento durante un giorno intero, questo è ancora la soluzione migliore (almeno per le vecchie versioni di SQL): WHERE DateColumn >= {TimeTruncatingExpression}(@DateValue) AND DateColumn < {TimeTruncatingExpression}(@DateValue + 1). Mi sentivo come se dovessi dire qualcosa dal momento che hai detto "Uso quasi sempre gli UDF" non ha spiegato nessuno degli svantaggi, né il modo di fare una query solo su data SARGable.
ErikE

@ErikE - Nessun problema, Erik. Quando ho usato UDF, ho lavorato con piccoli set di dati in cui le prestazioni non sono fondamentali, o più probabilmente ho filtrato la query in base al campo della data "non elaborato" (per garantire la sargabilità) ma selezionando la colonna con l'UDF applicato. Dato che di solito si tratta di piccoli set di dati una volta filtrati, l'esecuzione dell'UDF su questo piccolo numero di record non è un tale risultato. Detto questo, sollevi un ottimo punto e ho aggiornato la mia risposta per riflettere questo.
CraigTP

-4

Io userei:

CAST
(
CAST(YEAR(DATEFIELD) as varchar(4)) + '/' CAST(MM(DATEFIELD) as varchar(2)) + '/' CAST(DD(DATEFIELD) as varchar(2)) as datetime
) 

Creando così un nuovo campo in modo efficace dal campo data che hai già.


2
Perché dovresti farlo? Pensi che estrarre i bit da un datetimevalore, convertirli in stringhe, concatenarli insieme e infine riconvertire il risultato datetimesia meglio che, ad esempio, eseguire calcoli diretti sull'originale datetime(il metodo DATEADD/ DATEDIFF)?
Andriy M,

Inoltre, cosa sono MMe DD? Non esistono tali funzioni in SQL Server.
Andriy M,
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.