2013-11-20 17 views
34

Tôi đang cố gắng có được một tên ngày như thứ sáu, thứ bảy, chủ nhật, thứ hai, vv từ một ngày nhất định. Tôi biết có một xây dựng trong chức năng mà trả về tên ngày, ví dụ:Lấy tên ngày trong tuần từ Ngày đã cho trong SQL Server

SELECT DATENAME(dw,'09/23/2013') as theDayName 

SQL này truy vấn trở lại:

'Monday'

Đây là tất cả OK. Nhưng tôi muốn vượt qua từng đoạn Month, Day and Year.

Tôi đang sử dụng các chức năng DATEPART dựng sẵn để lấy tháng, ngày và năm sau cuộc hẹn hò để tôi có thể vượt qua nó để chức năng DATENAME:

SELECT DATEPART(m, GETDATE()) as theMonth -- returns 11 
SELECT DATEPART(d, GETDATE()) as theDay -- returns 20 
SELECT DATEPART(yy, GETDATE()) as theYear -- returns 2013 

Bây giờ tôi có giá trị theo tháng, ngày, năm cá nhân, tôi vượt qua nó để DATENAME tôi để có được những Weekname kể từ ngày tôi muốn:

--my SQL query to return dayName 
SELECT (DATENAME(dw, DATEPART(m, GETDATE())/DATEPART(d, myDateCol1)/ DATEPART(yy, getdate()))) as myNameOfDay, FirstName, LastName FROM myTable 

này trả về một ngày không chính xác Tên. Tôi đã thử thay thế/bằng - để trong hàm DATENAME truy vấn SQL của tôi trở thành:

SELECT DATENAME(dw,'09/23/2013') 
--becomes 
SELECT DATENAME(dw,'09-23-2013') 

nhưng nó vẫn trả về ngày không chính xác từ truy vấn SQL của tôi. Am i thiếu cái gì ở đây.

Vui lòng tư vấn.

+0

Xin lưu ý của 'chọn @@ DATEFIRST' đó là đặt 'SET DATEFIRST 7;' – SQLMason

Trả lời

29

Bạn cần tạo chuỗi ngày. Bạn đang sử dụng các toán tử / hoặc - hoạt động MATH/số trên các giá trị trả về số của DATEPART. Sau đó, DATENAME lấy giá trị số đó và diễn giải nó dưới dạng một ngày.

Bạn cần chuyển đổi nó thành chuỗi. Ví dụ:

SELECT (
    DATENAME(dw, 
    CAST(DATEPART(m, GETDATE()) AS VARCHAR) 
    + '/' 
    + CAST(DATEPART(d, myDateCol1) AS VARCHAR) 
    + '/' 
    + CAST(DATEPART(yy, getdate()) AS VARCHAR)) 
) 
5

Nếu bạn có SQL Server 2012:

Nếu phần ngày của bạn là các số nguyên sau đó bạn có thể sử dụng chức năng DATEFROMPARTS.

SELECT DATENAME(dw, DATEFROMPARTS(@Year, @Month, @Day)) 

Nếu phần ngày của bạn là chuỗi, sau đó bạn có thể sử dụng chức năng CONCAT.

SELECT DATENAME(dw, CONVERT(date, CONCAT(@Day, '/' , @Month, '/', @Year), 103)) 
47

Tested và hoạt động trên SQL 2005 và 2008. Không chắc f0r 2012. Giải pháp sử dụng DATENAME thay vì DATEPART

select datename(dw,getdate()) --Thursday 
select datepart(dw,getdate()) --2 
0
SELECT DATENAME(DW,CONVERT(VARCHAR(20),GETDATE(),101)) 
+3

Vui lòng cung cấp thêm một số chi tiết (ví dụ: giải thích đơn giản về những gì mà kịch bản SQL của bạn thực hiện) cho câu trả lời của bạn. – rbr94

Các vấn đề liên quan