2016-03-01 137 views
1

我在Sql中爲學校做了一項任務,並且遇到了麻煩。我必須創建一個用戶功能,當你輸入一個日期時,你將收到星期幾(星期一是1,星期二2等)的號碼。我我好不容易寫的代碼如下,但是我得到將字符串錯誤的日期和/或時間轉換爲星期幾的日期時,轉換失敗

,所以我猜「從性格 字符串錯誤轉換日期和/或時間時,轉換失敗」我需要做一些鑄件。我已經研究過,但到目前爲止,我只發現了日期時間提示以及如何轉換,因此我無法在代碼中實現。

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然後ELSE如果對於所有其他天),但我無法找出一個爲好。

+0

@TabAlleman請問你爲什麼要刪除'sql-server'標籤?我知道OP寫了'我在MySql中爲學校做作業',但他的例子清楚地表明它是T-SQL語言(SQL Server/Sybase)。 – lad2025

+0

我比第一句更重視代碼。對我來說,OP似乎更有可能在一個問題中發佈錯誤的代碼,而不是他會說在他沒有的時候專門使用MySQL。 –

+0

是的,我表達自己錯了。謝謝你糾正我。 –

回答

1

首先它看起來像SQL ServerGO,引用[])而不是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

相關問題