Trả lại tên tháng trong truy vấn máy chủ SQL


81

Bằng cách sử dụng SQL Server 2008, tôi có một truy vấn được sử dụng để tạo chế độ xem và tôi đang cố gắng hiển thị tên của tháng thay vì số nguyên.

Trong cơ sở dữ liệu của tôi, datetimelà trong một cột được gọi OrderDateTime. Các dòng trong truy vấn trả về ngày tháng là:

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

Điều này trả về một cột năm và một cột tháng dưới dạng số nguyên. Tôi muốn trả lại tên tháng (Jan, Feb, etc). Tôi đã thử:

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

Điều này rõ ràng là không chính xác, như tôi nhận được

Cú pháp không chính xác gần 'AS'

thông điệp. Cú pháp thích hợp cho truy vấn của tôi là gì?


8
Thông điệp cú pháp không chính xác là do không đóng cửa ra khỏi khung cuối cùng trước khi AS-CONVERT(varchar(3), DATEPART(MONTH, S0.OrderDateTime)) AS OrderMonth
Jaymz

Được S0 có ý nghĩa gì trong truy vấn sql
user7157710

@ user7157710 S0 là bí danh được cấp cho bảng nơi đặt trường.
tia97 27/12/16

Câu trả lời:


154

Điều này sẽ cung cấp cho bạn tên đầy đủ của tháng.

select datename(month, S0.OrderDateTime)

Nếu bạn chỉ muốn ba chữ cái đầu tiên, bạn có thể sử dụng

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

Nhận xét đăng sai trong câu trả lời "S0 có nghĩa là gì trong truy vấn sql?" bởi người dùng7157710
Petter Friberg

1
S0 là bí danh của một bảng. Câu trả lời đang chuyển nó qua câu hỏi.
Bpainter

Tôi muốn thêm rằng, thông thường, bạn thậm chí không muốn sử dụng các chức năng này. Tốt hơn hết bạn nên chọn ngày là ngày (giờ) hoặc tháng dưới dạng số nguyên hoặc bất kỳ thứ gì và sau đó để giao diện người dùng của bạn chăm sóc 'chuyển đổi' nó thành tên tháng thân thiện với con người. Bằng cách đó, ứng dụng / giao diện người dùng của bạn có thể chăm sóc bản địa hóa hơn là cơ sở dữ liệu của bạn, vốn không có manh mối nhỏ nhất về tùy chọn của người dùng hoặc cài đặt ứng dụng để bản địa hóa. Nói một cách khác, hãy nghĩ về nó như thế này: điều gì sẽ xảy ra nếu người dùng của bạn thích chữ Chinese của Trung Quốc hơn tháng 2?
RobIII

18

Bạn đã thử DATENAME(MONTH, S0.OrderDateTime)chưa?


12

Thay đổi:

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

Đến:

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

Tôi nghĩ bạn có nghĩa là DATENAME. DATEPARTsẽ không làm điều đó.
Druid


2

Chọn SUBSTRING (convert(varchar,S0.OrderDateTime,100),1,3)từ Tên bảng của bạn



1

Điều này sẽ cung cấp cho bạn những gì bạn đang yêu cầu:

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


0

Không cần nhấn db, chúng tôi có thể tìm nạp tên tất cả các tháng.

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

về cơ bản cái này ...

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')
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.