2010-09-15 8 views
6

muszę miesiąc z kolumny, która przechowuje ciąg w formacie -Jak uzyskać miesiąc z ciągu w sql?

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

Więc jeśli wartość była 'Feb2007' potem muszę wrócić 2 albo jeżeli wartość była 'Sep2009' potem muszę wrócić 9 .

Czy istnieje funkcja wbudowana w SQL Server 2008 do osiągnięcia czegoś podobnego?

+0

Wartości są przechowywane na liście rozdzielanej przecinkami? –

+0

Nie, to po prostu zapisane jako jeden wpis. Chodzi mi o to, że jeden wiersz ma wartość Feb2007, a drugi wiersz ma wartość Sep2008 – Vishal

+2

Mam nadzieję, że nie przechowujesz również cytatów w kolumnie! daty varchar są wystarczająco złe! –

Odpowiedz

9

Spróbuj tego:

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

+1: Działa dla mnie w 2005 roku –

+0

Myślę, że to naprawdę zależy od ustawień regionalnych. Założę się, że serwer sql może nie rozpoznać tego ciągu jako daty. –

+1

Zawsze drżę, gdy ktoś przechowuje datę/czas jako VARCHAR/etc zamiast rodzimego typu danych DATE/TIME ... –

1

Jeśli nic więcej, można utworzyć tabelę z nazwami miesięcy i wartości liczbowych.

Jeśli funkcja serwera zawsze poprawnie rozpoznaje nazwy miesięcy, oznacza to, że jesteś dobry, ale jeśli któryś z tych danych został wprowadzony ręcznie, mogą wystąpić błędy ortograficzne lub inne niespójności, a tabela pozwoli Ci je wspierać.

3

również to:

Wybierz miesiąc (CAST (date_col AS datetime))

+0

+1: Testowany, pracował również w 2005 roku –

+2

Lub po prostu 'wybierz miesiąc ('sep2008')' –

0

serdecznie zgodzić się z Beth tutaj - ale z uzasadnieniem, dlaczego powinno się to odbywać w przeciwieństwie do ostateczności:

Dane powinny być przechowywane w oryginalnym formacie. Nie powinieneś więcej przechowywać go jako ciąg niż 8-bitowa liczba całkowita. To ma tyle samo sensu. SQL jest bardzo inteligentną bestią, ale jeśli pominiesz podstawowe typy danych, większość jego użytecznej funkcjonalności i heurystyki zniknie z ekranu - nawet podstawowe rzeczy, takie jak indeksowanie i sortowanie. Nie wspominając już o tym, że twoje dane stają się jawne SQL Server (tj. Opiera się na pewnym zachowaniu SQL) w przeciwieństwie do ogólnych, zmniejszając przenośność.

Mówiąc bardziej formalnie: zmuszasz go, by stał się informacją w warstwie danych. Jest to antyteza wszystkich znanych zasad przetwarzania danych.

0
SELECT month(column); 

To powinno zadziałać, ale minęło trochę czasu, odkąd korzystałem z SQL Server.

0
datepart(month,_datetime) 

gdzie _datetime jest kolumną. można również użyć

datepart(month,getdate()) 

uzyskać bieżący miesiąc

0

może trzeba ponownie swój projekt bazy danych, jeśli w ogóle możliwe. O wiele bardziej wydajne, aby przekonwertować go na datetime przed przechowywaniem w tabeli. Na przykład znalezienie zakresu dat zajmie znacznie więcej czasu, niż trzeba, ponieważ musisz podać każdą odrębną wartość przed znalezieniem dat w swoim zakresie.

Powiązane problemy