Zwracająca nazwa miesiąca w kwerendzie SQL Server


81

Używając SQL Server 2008, mam zapytanie, które jest używane do tworzenia widoku i próbuję wyświetlić nazwę miesiąca zamiast liczby całkowitej.

W mojej bazie danych datetimeznajduje się w kolumnie o nazwie OrderDateTime. Wiersze w zapytaniu zwracające datę to:

DATENAME(yyyy, S0.OrderDateTime) AS OrderYear,
DATEPART(MONTH, S0.OrderDateTime) AS OrderMonth

Zwraca kolumnę lat i kolumnę miesięcy jako liczby całkowite. Chcę zwrócić nazwy miesięcy (Jan, Feb, etc). Próbowałem:

CONVERT(varchar(3), DATEPART(MONTH, S0.OrderDateTime) AS OrderMonth

Jak rozumiem, jest to oczywiście nieprawidłowe

Nieprawidłowa składnia w pobliżu „AS”

wiadomość. Jaka jest prawidłowa składnia mojego zapytania?


8
Niepoprawna składnia jest spowodowana ASCONVERT(varchar(3), DATEPART(MONTH, S0.OrderDateTime)) AS OrderMonth
niezamknięciem

Co oznacza S0 w zapytaniu sql
user7157710

@ user7157710 S0 to alias nadany tabeli, w której znajduje się pole.
tia97

Odpowiedzi:


155

W ten sposób otrzymasz pełną nazwę miesiąca.

select datename(month, S0.OrderDateTime)

Jeśli chcesz tylko pierwsze trzy litery, możesz użyć tego

select convert(char(3), S0.OrderDateTime, 0)

Komentarz niepoprawnie zamieszczony w odpowiedzi "Co oznacza S0 w zapytaniu sql?" autor: user7157710
Petter Friberg

1
S0 jest aliasem tabeli. Odpowiedź przenosi to z pytania.
Bpainter

Chciałbym dodać, że zazwyczaj nie chcesz nawet korzystać z tych funkcji. Lepiej jest wybrać datę jako datę (czas) lub miesiąc jako liczbę całkowitą lub cokolwiek, a następnie pozwól, aby Twój interfejs użytkownika zajął się `` konwersją '' go na przyjazną dla człowieka nazwę miesiąca. W ten sposób aplikacja / interfejs użytkownika może zająć się lokalizacją, a nie bazą danych, co nie ma najmniejszego pojęcia o preferencjach użytkownika ani ustawieniach aplikacji dotyczących lokalizacji. Ujmując to inaczej, pomyśl o tym w ten sposób: a co, jeśli twój użytkownik woli chiński 二月 od lutego?
RobIII


12

Zmiana:

CONVERT(varchar(3), DATEPART(MONTH, S0.OrderDateTime) AS OrderMonth

Do:

CONVERT(varchar(3), DATENAME(MONTH, S0.OrderDateTime)) AS OrderMonth

Myślę, że masz na myśli DATENAME. DATEPARTnie zrobiłbym tego.
Druid




1

To da ci to, o co prosisz:

select convert(varchar(3),datename(month, S0.OrderDateTime)) 


0

Bez wciskania db możemy pobrać nazwy wszystkich miesięcy.

WITH CTE_Sample1 AS
(
    Select 0 as MonthNumber

    UNION ALL

    select MonthNumber+1 FROM CTE_Sample1
        WHERE MonthNumber+1<12
)

Select DateName( month , DateAdd( month , MonthNumber ,0 ) ) from CTE_Sample1

0

w zasadzie to ...

declare @currentdate datetime = getdate()
select left(datename(month,DATEADD(MONTH, -1, GETDATE())),3)
union all
select left(datename(month,(DATEADD(MONTH, -2, GETDATE()))),3)
union all
select left(datename(month,(DATEADD(MONTH, -3, GETDATE()))),3)

0
DECLARE @iMonth INT=12
SELECT CHOOSE(@iMonth,'JANUARY','FEBRUARY','MARCH','APRIL','MAY','JUNE','JULY','AUGUST','SEPTEMBER','OCTOBER','NOVEMBER','DECEMBER')

0

dla mnie DATENAME nie był dostępny z powodu ograniczeń firmy ... ale to też działało bardzo łatwo.

FORMAT(date, 'MMMM') AS month
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.