2009-09-11 13 views
7

Sto cercando di trovare un modo elegante per ottenere una data da una colonna di testo con dati come "YYYYMMDD" ... quindi potremmo vedere "20060508" come valore nella colonna, che vorrei poter restituire da una query come data (8 maggio 2006).Analizza una data da un testo non formattato in SQL

Sono sicuro di poter hackerare qualcosa insieme dato abbastanza tempo, ma gli approcci a cui sto pensando sembrano piuttosto sfacciati, e sospetto che ci sia un modo in cui questo può essere elegantemente fatto in una singola query.

Qualche suggerimento?

+0

Penso che realmente significa restituirlo come testo formattato come 8 MAGGIO 2006 (in contrapposizione ad una data). – RichardOD

+1

No ... (sembra esserci confusione su questo, quindi ovviamente non mi sono spiegato bene.) Voglio davvero un appuntamento ... Stavo solo dando "l'8 maggio 2006" per spiegare quale sia il valore della data dovrebbe rappresentare Apparentemente, ho solo confuso le persone. :) – Beska

risposta

23

Questa è già una data valida - ISO-8601 - basta usare:

SELECT CAST('20060508' AS DATETIME) 

o in alternativa:

SELECT CONVERT(DATETIME, '20060508', 112) 

e che dovrebbe fare bene!

Al fine di ottenere il vostro "08 Maggio 2006" di visualizzazione, fare un altro convertire in varchar, utilizzando lo stile convertito Data 107:

SELECT CONVERT(VARCHAR(25), CAST('2006-05-08' AS DATETIME), 107) 

Vedi here per ulteriori informazioni sulla fusione & conversione in MS SQL

+0

restituisce data come _2006-05-08 00: 00: 00.000_ e non _May 8, 2006_ –

+0

+1. Io sceglierei il CAST da solo. – RichardOD

+1

sì, CAST è il modo preferito per farlo, ma per ottenere uno stile specifico, potrebbe essere necessario utilizzare il CONVERT con un ID di stile a volte. –

2
select cast('20060508' as datetime) AS MyDate 

ti dà questo risultato ...

MyDate 
----------------------- 
2006-05-08 00:00:00.000 

Vedere here per ulteriori informazioni sulla conversione & in MS SQL.

Se si sta tentando di ottenere un formato specifico (8 maggio 2006), è consigliabile considerare di restituire la colonna come valore di data/ora e lasciare che qualsiasi cosa visualizzi tale valore all'utente finale (sito Web, client app, report, ecc.) esegue la formattazione. Se lo formatti alla query, restituirai una stringa, il che renderà più difficile lo scambio di formati dal tuo front-end in futuro. Se vuoi farlo in SQL - controlla il formato 107 nel link qui sopra.

+0

Grazie per il link .... che spiega un po 'della magia sui numeri che vedo nelle altre risposte. – Beska

1

Nessun problema, solo CONVERT it. Lo stile "112" o ISO gestirà il tuo esempio.

SELECT CONVERT(datetime,'20060508',112) 

rendimenti

----------------------- 2006-05-08 00:00:00.000 

(1 row(s) affected) 
1

prova:

SELECT REPLACE(CONVERT(varchar(30),CONVERT(datetime, '20060508'),107),' 0',' ') 

uscita:

------------------- 
May 8, 2006 

(1 row(s) affected) 
+0

Grazie per la formattazione extra, anche se non è necessaria ... Stavo solo dando quell'output per descrivere meglio il formato in cui i dati erano stati avviati e come dovrebbe essere tradotto correttamente. Finché è in formato data, posso affrontarlo. – Beska

Problemi correlati