2013-11-20 5 views
34

Я пытаюсь получить имя дня, например, пятница, суббота, воскресенье, понедельник и т. Д. С определенной даты. Я знаю, что есть встроенная функция, которая возвращает название дня, например:Получить имя дня недели от заданной даты в SQL Server

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

это SQL возвращает запрос:

«понедельник»

Это все в порядке. Но я хотел бы пройти Month, Day and Year отдельно.

Я использую встроенную функцию DATEPART получить месяц, день и год от даты, так что я могу передать его функции 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 

Теперь у меня есть ценности месяц, день, год по отдельности, Я передаю его к моим DATENAME получить Weekname о дате Я хочу:

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

Это возвращает неправильные именины. Я пытался заменить/с - так, что в функции DATENAME мой SQL-запрос будет выглядеть так:

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

, но она по-прежнему возвращает неправильный DAYNAME из моего SQL запроса. Я что-то упустил.

Прошу совета.

+0

Обратите внимание на 'выберите @@ DATEFIRST', который set 'SET DATEFIRST 7;' – SQLMason

ответ

29

Вам нужно построить строку даты. Вы используете операторы / или -, которые выполняют MATH/числовые операции с числовыми значениями возврата DATEPART. Затем DATENAME принимает это числовое значение и интерпретирует его как дату.

Вам необходимо преобразовать его в строку. Например:

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

Если у вас есть SQL Server 2012:

Если дата части являются целыми числами, то вы можете использовать DATEFROMPARTS функцию.

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

Если дата части строки, то вы можете использовать функцию CONCAT.

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

протестирована и работает на SQL 2005 и 2008. Не уверен, что f0r 2012 Решение использует DATENAME вместо DATEPART

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

Просьба предоставить более подробную информацию (например, простое объяснение того, что вы делаете на SQL-скрипте), к вашему ответу. – rbr94

Смежные вопросы