2016-03-01 2 views
1

Я выполняю задание для школы в Sql, и у меня возникли проблемы. Я должен создать функцию пользователя, когда при вводе даты вы получите номер дня недели (понедельник - 1, вторник 2 и т. Д.). Я код, который я успел написать ниже, однако я получаюОшибка конверсии при преобразовании даты и/или времени из символьной строки при присвоении чисел дням недели

«Конверсия удалось при преобразовании даты и/или времени из символов ошибки строки»

так я думаю, мне нужно сделать некоторые Кастинг. Я исследовал, но до сих пор я нашел только подсказки datetime как конвертировать и до сих пор, я не смог реализовать в своем коде.

CREATE FUNCTION [dbo].[whichDay] (@p_day [datetime]) 
RETURNS [int] 
AS 
BEGIN 
DECLARE @selectedDate [int] 
SET @selectedDate= CASE 
    WHEN @p_day IN (N'Monday') THEN 1 
    WHEN @p_day IN (N'Tuesday') THEN 2 
    WHEN DAY (@p_day) IN (N'Wednesday') THEN 3  
    WHEN DAY (@p_day) IN (N'Thursday') THEN 4  
    WHEN DAY (@p_day) IN (N'Friday') THEN 5  
    WHEN DAY (@p_day) IN (N'Saturday') THEN 6 
    ELSE 7 
END 
RETURN @selectedDate 

END; 
GO 

Я попытался также это с IF заявления (IF THEN ELSE IF для всех остальных дней), но я не мог понять, что один, как хорошо.

+0

@TabAlleman Могу ли я спросить, почему вы удалили тег 'sql-server'? Я знаю, что OP писал: «Я выполняю задание для школы в MySql», но его пример явно указывает, что это язык T-SQL (SQL Server/Sybase). – lad2025

+0

Я дал больше веса первому предложению, чем коду. Мне показалось более вероятным, что ОП поставит ошибочный код в вопросе, чем он скажет, что он специально использует MySQL, когда он этого не делает. –

+0

Да, я сам себя не понял. Спасибо, что исправил меня. –

ответ

1

В первую очередь это выглядит как SQL Server (GO, цитирование []) не MySQL.

Ваш код не работает, потому что вы не можете сравнить DATE с неверным листом даты.

WHEN @p_day IN (N'Monday') THEN 1 
-- here you compares some date with 'Monday' 
-- DATETIME has higher precedence than string so SQL Server tries to 
-- implicitly cast to DATETIME 

<=> 
SELECT @p_day = CAST('Monday' AS DATETIME) 
-- Conversion failed when converting date and/or time from character string. 

Чтобы получить день недели вы можете использовать встроенный в DATEPART:

SET DATEFIRST 1;  -- set first day of week to `Monday` default for US is Sunday 
-- this could be set as global or connection based 
DECLARE @p_day [datetime] = GETDATE(); 

SELECT DATEPART(dw, @p_day); 

LiveDemo


Если вы используете MySQL вы можете использовать DAYOFWEEK:

Возвращает индекс недели за день (1 = воскресенье, 2 = понедельник, ..., 7 = суббота). Эти значения индекса соответствуют стандарту ODBC.

SELECT IF(DAYOFWEEK(NOW())-1=0, 7,DAYOFWEEK(NOW())-1); 

SqlFiddleDemo

Добавление

еще одно сравнение непосредственно название дня недели не будет работать, если язык отличается, что en.

DATENAME:

Возвращаемое значение зависит от языковой среды, установленной с помощью SET LANGUAGE и Настроить язык по умолчанию Конфигурация сервера Вариант логина на

Рассмотрим:

SET LANGUAGE russian; 
SELECT DATENAME(dw,GETDATE()); 
-- среда 

LiveDemo2

Затем, используя код, как вы предложили в https://stackoverflow.com/a/35735514/5070879 всегда будет возвращать 7.

0

Спасибо lad2025 для входа. Это помогло мне понять, в чем проблема. Я скорректировал код, и теперь он работает по назначению. Помимо вашего совета, я просмотрел некоторые заметки, которые у меня были из класса, и использовал другой метод решения проблемы. Я считаю, что это можно сделать с меньшим количеством строк кода, однако он выполняет желаемую функцию. Вы можете увидеть правильный код ниже:

CREATE FUNCTION [dbo].[kojiJeDan] (@p_day [datetime]) 

RETURNS [int] 

AS 

BEGIN 

DECLARE @selectedDate [int] 
SET @selectedDate= CASE (SELECT DATENAME(dw, @p_day)) 
WHEN N'Monday' THEN 1 
WHEN N'Tuesday' THEN 2 
WHEN N'Wednesday' THEN 3 
WHEN N'Thursday' THEN 4 
WHEN N'Friday' THEN 5 
WHEN N'Saturday' THEN 6 
ELSE 7 
END 
RETURN @selectedDate 
END; 

GO 
+0

Вы должны заметить, что 'DATENAME' зависит от языка. См. Мое редактирование. – lad2025

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

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