2013-01-07 40 views
0
declare @timeid int 

if(datename(Dw,getdate())='Monday') 
begin 
set @timeid=3 
end 
Else if(datename(Dw,getdate())='Sunday' or datename(Dw,getdate())='Saturday') 
begin 
    set @timeId=2 
end 

ELSE -- for Tuesday to Friday 

begin 
if(convert(varchar(11),getdate(),108)<='08:30:00') 
    begin 
    set @timeId=1 
    end 
else 
    begin 
    set @timeId=0 
    end 
end 

select @timeid 

錯誤被拋出:SQL嵌套if否則,如果語法錯誤

消息156,級別15,狀態1,行附近關鍵字'別人的13
不正確的語法。
Msg 102,Level 15,State 1,Line 32
'@timeid'附近語法不正確。

請幫忙。

+0

什麼是GETDATE()爲您的輸出? – Nalaka526

+0

@ Nalaka526,我不明白'GETDATE()'的結果可能會如何,因爲這是一個編譯時錯誤。 – harpo

+0

今天的日期.. 2013-01-07 08:43:18.843 –

回答

3

好的,我敢肯定你的語法錯誤是varchar(11)應該是varchar

儘管如此,這不利於SQL;首先,您使用getdate() 3次 - 每次會有所不同(以毫秒爲單位),這可能意味着從第一次和最後一次通話之間的星期五至星期六,或從0​​8:30之前至08:30之後。

試試這個:

declare @timeid int 
declare @nowtime datetime 

select @nowtime=getdate() 

select @timeid = CASE datename(Dw,@nowtime) 
        WHEN 'Monday' THEN 3 
        WHEN 'Sunday' THEN 2 
        WHEN 'Saturday' THEN 2 
        ELSE 
        CASE 
         WHEN convert(varchar,getdate(),108)<='08:30:00' THEN 1 
         ELSE 0 
        END 
       END 
+2

如果SQL Server版本是2008或更高版本,您可以將您的聲明和初始化組合到一行中: 'declare @nowtime datetime = getdate()' –

+0

使用'varchar(11)'不應該拋出錯誤 - 最多隻會截斷結果 – 2013-01-07 04:23:04

+2

您應該**總是**定義一個'varchar'的顯式長度 - 否則您可能突然以1個字符的長字符串結束..... –

2

@DaleM打我,但,是的,這裏是另一個改寫爲清楚:

DECLARE @DOW_SUNDAY int 
DECLARE @DOW_MONDAY int 
DECLARE @DOW_SATURDAY int 

SET @DOW_SUNDAY = 1 
SET @DOW_MONDAY = 2 
SET @DOW_SATURDAY = 7 

DECLARE @now datetime 
DECLARE @day_of_week int 

SET @now = GETDATE() 
SET @day_of_week = DATEPART(DW, @now) 

SELECT CASE WHEN @day_of_week = @DOW_MONDAY 
      THEN 3 
      WHEN @day_of_week IN (@DOW_SATURDAY, @DOW_SUNDAY) 
      THEN 2 
      WHEN CONVERT(varchar, @now, 108) <= '08:30:00' 
      THEN 1 
      ELSE 0 
     END 
+0

一個很好的例子從'GetDate()'中緩存一個值,然後使用它。 – HABO