2013-01-07 36 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