2010-09-15 22 views
6

Devo ottenere il mese da una colonna che memorizza stringa in formato -Come ottenere il mese da una stringa in sql?

Column 
---------- 
`Feb2007'  
'Sep2008' 

Quindi, se il valore era 'Feb2007' poi ho bisogno di tornare 2 oppure se il valore era 'Sep2009' allora dovrei tornare 9 .

Esiste una funzione incorporata in SQL Server 2008 per ottenere qualcosa di simile?

+0

I valori sono memorizzati in un elenco separato da virgole? –

+0

No, è appena memorizzato come una voce. Voglio dire che una riga ha valore Feb2007 e quindi la seconda riga ha valore Sep2008 – Vishal

+2

Spero che tu non stia memorizzando anche le virgolette "" nella colonna! le date varchar sono abbastanza brutte! –

risposta

9

Prova questo:

select datepart(mm, cast('feb2008' as datetime)) 
+1

+1: funziona per me nel 2005 –

+0

Suppongo che dipenda davvero dalle impostazioni regionali. Scommetto che potrebbe essere possibile per il server SQL non riconoscere questa stringa come data. –

+1

Mi viene sempre il brivido quando qualcuno memorizza una data/ora come VARCHAR/etc piuttosto che il tipo di dati DATE/TIME nativo ... –

1

Se non altro, è possibile creare una tabella con i vostri nomi dei mesi e dei valori numerici.

Se la funzione server riconosce sempre correttamente i nomi dei mesi, si sta bene, ma se qualcuno di questi dati è stato inserito manualmente, potrebbero esserci errori di ortografia o altre incongruenze e una tabella consentirebbe di supportarli.

3

anche questo:

SELEZIONA MESE (CAST (date_col AS datetime))

+0

+1: testato, ha funzionato anche nel 2005 –

+2

o semplicemente "seleziona mese ('sep2008')' –

0

tutto cuore d'accordo con Beth qui - ma con giustificazioni sul perché dovrebbe essere fatto al contrario di come ultima risorsa:

I dati devono essere archiviati nel suo formato nativo. Non dovresti più memorizzarlo come stringa di un intero a 8 bit. Rende tanto/poco senso. SQL è una bestia molto intelligente, ma se rovini i tuoi tipi di dati fondamentali la maggior parte delle sue utili funzionalità ed euristiche escono dalla finestra - anche elementi di base come l'indicizzazione e . Per non parlare dei dati che diventano espliciti in SQL Server (ad esempio, si basa su un determinato comportamento SQL) piuttosto che generico, riducendo la portabilità.

Per dirla in termini più formali: si sta costringendo a diventare informazioni a livello di dati. Questo è in antitesi con tutte le regole conosciute di gestione dei dati.

0
SELECT month(column); 

Questo dovrebbe funzionare, è da un po 'che non utilizzo SQL Server.

0
datepart(month,_datetime) 

dove _datetime è la colonna. è anche possibile utilizzare

datepart(month,getdate()) 

per ottenere il mese corrente

0

potrebbe essere necessario rivedere la struttura del database, se possibile. Molto più efficiente per convertirlo in datetime prima di memorizzarlo nella tabella. Ad esempio, la ricerca di un intervallo di date richiederà molto più tempo del necessario perché dovresti trasmettere ogni valore distinto prima di trovare le date nell'intervallo.

Problemi correlati