【问题标题】:SQL nested if else if Syntax errorSQL 嵌套 if else if 语法错误
【发布时间】:2013-01-07 13:45:30
【问题描述】:
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

正在抛出错误:

消息 156,第 15 级,状态 1,第 13 行
关键字“Else”附近的语法不正确。
消息 102,第 15 级,状态 1,第 32 行
'@timeid' 附近的语法不正确。

请帮忙。

【问题讨论】:

  • GETDATE() 对你的输出是什么?
  • @Nalaka526,我看不出GETDATE() 的结果有什么影响,因为这是一个编译时错误。
  • 今天日期.. 2013-01-07 08:43:18.843
  • 这实际上为我运行,在 SQL Server Express 2008 R2 中(输出为 2)。您运行的是什么版本的 SQL Server?
  • 小心“@timeid”和“@timeId”

标签: sql sql-server tsql sql-server-2005


【解决方案1】:

好的,我很确定您的语法错误是 varchar(11) 应该是 varchar

尽管如此,这对 SQL 的使用并不好;首先,您使用getdate() 3 次 - 每次都会有所不同(以毫秒为单位),这可能意味着在第一次和最后一次通话之间从周五到周六,或者从 08: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

【讨论】:

  • 如果 SQL Server 的版本是 2008 或更高版本,您可以将声明和初始化合并为一行:declare @nowtime datetime = getdate()
  • 使用 varchar(11) 不应该抛出错误 - 最多只会截断结果
  • 你应该总是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

【讨论】:

  • GetDate() 缓存单个值并在之后使用它的一个很好的例子。
猜你喜欢
  • 1970-01-01
  • 2012-10-14
  • 1970-01-01
  • 2019-08-29
  • 1970-01-01
  • 1970-01-01
  • 2017-08-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多