Formattazione personalizzata data / ora in SQL Server

Sto cercando di scrivere una stored procedure che seleziona le colonne da una tabella e aggiunge 2 colonne aggiuntive al ResultSet. Queste 2 colonne aggiuntive sono il risultato di conversioni su un campo della tabella che è un campo Datetime.

Il campo formato Datetime ha il seguente formato ‘AAAA-MM-GG HH: MM: SS.S’

I 2 campi aggiuntivi che dovrebbero essere nel seguente formato:

  1. DDMMM
  2. HHMMT, dove T è ‘A’ per am e ‘P’ per pm

Esempio: se i dati nel campo erano “2008-10-12 13: 19: 12.0”, i campi estratti dovrebbero contenere:

  1. 12OCT
  2. 0119P

Ho provato a utilizzare i formati di stringa CONVERT, ma nessuno dei formati corrisponde all’output che voglio ottenere. Sto pensando di estrapolare i dati del campo tramite CONVERT e poi usare REPLACE, ma sicuramente ho bisogno di aiuto qui, perché non ne sono sicuro.

Qualcuno esperto in stored procedure può aiutarmi qui? Grazie!

Se dt è la tua colonna datetime, allora

Per 1:

SUBSTRING(CONVERT(varchar, dt, 13), 1, 2) + UPPER(SUBSTRING(CONVERT(varchar, dt, 13), 4, 3)) 

Per 2:

 SUBSTRING(CONVERT(varchar, dt, 100), 13, 2) + SUBSTRING(CONVERT(varchar, dt, 100), 16, 3) 

Usa DATENAME e racchiudi la logica in una funzione, non in un processo memorizzato

 declare @myTime as DateTime set @myTime = GETDATE() select @myTime select DATENAME(day, @myTime) + SUBSTRING(UPPER(DATENAME(month, @myTime)), 0,4) 

Restituisce “14OCT”

Cerca di non utilizzare alcuna operazione basata su caratteri / stringa se ansible quando lavori con le date. Sono numerici (un float) e le prestazioni risentiranno di tali conversioni dei tipi di dati.

Scava queste utili conversioni che ho compilato nel corso degli anni …

 /* Common date functions */ --//This contains common date functions for MSSQL server /*Getting Parts of a DateTime*/ --//gets the date only, 20x faster than using Convert/Cast to varchar --//this has been especially useful for JOINS SELECT (CAST(FLOOR(CAST(GETDATE() as FLOAT)) AS DateTime)) --//gets the time only (date portion is '1900-01-01' and is considered the "0 time" of dates in MSSQL, even with the datatype min value of 01/01/1753. SELECT (GETDATE() - (CAST(FLOOR(CAST(GETDATE() as FLOAT)) AS DateTime))) /*Relative Dates*/ --//These are all functions that will calculate a date relative to the current date and time /*Current Day*/ --//now SELECT (GETDATE()) --//midnight of today SELECT (DATEADD(ms,-4,(DATEADD(dd,DATEDIFF(dd,0,GETDATE()) + 1,0)))) --//Current Hour SELECT DATEADD(hh,DATEPART(hh,GETDATE()),CAST(FLOOR(CAST(GETDATE() AS FLOAT)) as DateTime)) --//Current Half-Hour - if its 9:36, this will show 9:30 SELECT DATEADD(mi,((DATEDIFF(mi,(CAST(FLOOR(CAST(GETDATE() as FLOAT)) as DateTime)), GETDATE())) / 30) * 30,(CAST(FLOOR(CAST(GETDATE() as FLOAT)) as DateTime))) /*Yearly*/ --//first datetime of the current year SELECT (DATEADD(yy,DATEDIFF(yy,0,GETDATE()),0)) --//last datetime of the current year SELECT (DATEADD(ms,-4,(DATEADD(yy,DATEDIFF(yy,0,GETDATE()) + 1,0)))) /*Monthly*/ --//first datetime of current month SELECT (DATEADD(mm,DATEDIFF(mm,0,GETDATE()),0)) --//last datetime of the current month SELECT (DATEADD(ms,-4,DATEADD(mm,1,DATEADD(mm,DATEDIFF(mm,0,GETDATE()),0)))) --//first datetime of the previous month SELECT (DATEADD(mm,DATEDIFF(mm,0,GETDATE()) -1,0)) --//last datetime of the previous month SELECT (DATEADD(ms, -4,DATEADD(mm,DATEDIFF(mm,0,GETDATE()),0))) /*Weekly*/ --//previous monday at 12AM SELECT (DATEADD(wk,DATEDIFF(wk,0,GETDATE()) -1 ,0)) --//previous friday at 11:59:59 PM SELECT (DATEADD(ms,-4,DATEADD(dd,5,DATEADD(wk,DATEDIFF(wk,0,GETDATE()) -1 ,0)))) /*Quarterly*/ --//first datetime of current quarter SELECT (DATEADD(qq,DATEDIFF(qq,0,GETDATE()),0)) --//last datetime of current quarter SELECT (DATEADD(ms,-4,DATEADD(qq,DATEDIFF(qq,0,GETDATE()) + 1,0))) 

Non rispondere alla tua domanda in modo specifico, ma non è qualcosa che dovrebbe essere gestito dal livello di presentazione della tua applicazione. Facendolo nel modo in cui descrivi crea un’ulteriore elaborazione sul database e aggiungi traffico di rete extra (supponendo che il database esista su una macchina diversa dall’applicazione), per qualcosa che potrebbe essere facilmente calcolato dal lato dell’applicazione, con una data più ricca elaborare le librerie, oltre ad essere più indipendente dal linguaggio, specialmente nel caso del primo esempio che contiene il nome del mese abbreviato. In ogni caso, le risposte che gli altri ti danno dovrebbero indirizzarti nella giusta direzione se decidi ancora di percorrere questa strada.

È ansible utilizzare il seguente comando nel server SQL per renderlo:

 select FORMAT(getdate(), N'yyyy-MM-ddThh:mm:ss') 

Il campo formato Datetime ha il seguente formato ‘AAAA-MM-GG HH: MM: SS.S’

Questa affermazione è falsa. Ecco come Enterprise Manager o SQL Server scelgono di mostrare la data. Internamente è un valore binario di 8 byte, motivo per cui alcune delle funzioni pubblicate da Andrew funzioneranno molto bene.

Anche il Kibbee è un punto valido, e in un mondo perfetto sarei d’accordo con lui. Tuttavia, a volte si desidera associare direttamente i risultati della query per visualizzare il controllo oi widget e non c’è davvero alcuna possibilità di eseguire alcuna formattazione. E a volte il livello di presentazione vive su un server Web che è persino più occupato del database. Con questi in mente, non è necessariamente una brutta cosa sapere come farlo in SQL.

Sì, Depart è una soluzione per questo, ma penso che questo tipo di metodi siano lunghi viaggi!

SERVER SQL:

 SELECT CAST(DATEPART(DD,GETDATE()) AS VARCHAR)+'/' +CAST(DATEPART(MM,GETDATE()) AS VARCHAR) +'/'+CAST(DATEPART(YYYY,GETDATE()) AS VARCHAR) +' '+CAST(DATEPART(HH,GETDATE()) AS VARCHAR) +':'+CAST(DATEPART(MI,GETDATE()) AS VARCHAR) 

Oracolo:

 Select to_char(sysdate,'DD/MM/YYYY HH24:MI') from dual 

Puoi scrivere la tua funzione in questo modo puoi liberarti di questo casino;

http://sql.dzone.com/news/custom-date-formatting-sql-ser

 select myshortfun(getdate(),myformat) GO 

Avrai bisogno di DATEPART qui. È ansible concatenare insieme i risultati delle chiamate DATEPART.

Per ottenere le abbreviazioni del mese, potresti essere in grado di utilizzare DATENAME; se ciò non funziona per te, puoi utilizzare un’istruzione CASE sul DATEPART.

DATEPART funziona anche per il campo del tempo.

Posso pensare ad un paio di modi per ottenere l’indicatore AM / PM, compreso il confronto di nuove date create tramite DATEPART o il calcolo dei secondi totali trascorsi nel giorno e il confronto con le soglie AM / PM note.

in MS SQL Server puoi fare:

SET DATEFORMAT ymd

anno mese giorno,

Se è qualcosa di più specifico come DateKey ( yyyymmdd ) di cui hai bisogno per i modelli dimensionali, ti suggerisco qualcosa senza alcun cast / conversione:

 DECLARE @DateKeyToday int = (SELECT 10000 * DATEPART(yy,GETDATE()) + 100 * DATEPART(mm,GETDATE()) + DATEPART(dd,GETDATE())); PRINT @DateKeyToday 

Sto aggiungendo questa risposta (per me stesso) come rilevante per la formattazione personalizzata.

Per underscore yyyy_MM_dd

 REPLACE(SUBSTRING(CONVERT(VARCHAR, @dt, 120), 1, 10),'-','_')