Domanda

Sto cercando di scrivere una procedura memorizzata che seleziona le colonne da una tabella e aggiunge 2 colonne aggiuntive al ResultSet. Queste 2 colonne extra sono il risultato di conversioni su un campo nella 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 a.m. e 'P' per p.m.

Esempio: se i dati nel campo erano "12-10-2008 13: 19: 12,0", i campi estratti devono contenere:

  1. 12OCT
  2. 0119P

Ho provato a usare i formati di stringa CONVERT, ma nessuno dei formati corrisponde all'output che voglio ottenere. Sto pensando di estrarre i dati del campo tramite CONVERT e quindi utilizzare REPLACE, ma sicuramente ho bisogno di aiuto qui, di cui non sono sicuro.

Qualcuno potrebbe essere esperto nelle procedure memorizzate per aiutarmi qui? Grazie!

È stato utile?

Soluzione

Se dt è la colonna del tuo datetime, quindi

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)

Altri suggerimenti

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 usare alcuna operazione basata su caratteri / stringhe se possibile quando lavori con le date. Sono numerici (a virgola mobile) e le prestazioni risentiranno di tali conversioni di tipi di dati.

Scava queste utili conversioni che ho compilato negli 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)))

È possibile utilizzare il seguente comando nel server SQL per eseguirlo:

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

Non rispondere alla domanda in modo specifico, ma non è qualcosa che dovrebbe essere gestito dal livello di presentazione dell'applicazione. Farlo nel modo che descrivi crea un'elaborazione aggiuntiva alla fine del database e aggiunge un ulteriore traffico di rete (supponendo che il database esista su una macchina diversa dall'applicazione), per qualcosa che potrebbe essere facilmente calcolato sul lato dell'applicazione, con una data più ricca elaborazione delle librerie, oltre ad essere più agnostica della lingua, specialmente nel caso del tuo primo esempio che contiene il nome del mese abbreviato. Comunque le risposte che gli altri ti danno dovrebbero indirizzarti nella giusta direzione se decidi ancora di seguire questa strada.

  

Il campo Formato datetime ha il seguente formato "AAAA-MM-GG HH: MM: SS.S"

Questa affermazione è falsa. È così che 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 così bene.

Anche Kibbee ha 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 o i widget e non è davvero possibile eseguire alcuna formattazione. E a volte il livello di presentazione vive su un server Web che è ancora più occupato del database. Con questi in mente, non è necessariamente una brutta cosa sapere come farlo in SQL.

Sì Partenza è 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)

Oracle:

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

Puoi scrivere la tua funzione in questo modo per sbarazzarti di questo casino;

http://sql.dzone.com/news/custom- data-formattazione-sql-ser

select myshortfun(getdate(),myformat)
GO

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

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

DATEPART funziona anche per il campo orario.

Posso pensare a un paio di modi per ottenere l'indicatore AM / PM, incluso il confronto di nuove date costruite tramite DATEPART o il calcolo dei secondi totali trascorsi nel giorno e il confronto con le soglie AM / PM conosciute.

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 / convertito:

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

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

Per la sottolineatura yyyy_MM_dd

REPLACE(SUBSTRING(CONVERT(VARCHAR, @dt, 120), 1, 10),'-','_')
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top