【问题标题】:Select query involving comparison between dates and time选择涉及日期和时间比较的查询
【发布时间】:2013-03-04 12:02:59
【问题描述】:

这是我的 MS Sql 表.. 桌子: http://snag.gy/L6ag1.jpg

SELECT 
    * 
FROM Table1 
WHERE   
    Class = '12' 
    AND Section = 'B' 
    AND '3/4/2013' BETWEEN DATE AND TODATE 
    and '3/14/2013' between Date and ToDate 
    or '3/4/2013' < Date and '3/14/2013' > ToDate 
    AND (
            '12:00 PM'  between [StartTime] and endtime 
            and '1:00 PM' between [StartTime] and endtime 
            or ('12:00 PM' < StartTime and '1:00 PM' > EndTIme)
        )

上面的查询返回表的所有 6 行,而下面的查询返回 0 行..

SELECT 
    * 
FROM Teacher 
WHERE   
    Class = '12' 
    AND Section = 'B' 
    and '12:00 PM'  between [StartTime] and endtime 
    and '1:00 PM' between [StartTime] and endtime 
    or ('12:00 PM' < StartTime and '1:00 PM' > EndTIme)

自从我使用 AND 操作数以来,我希望顶部的查询返回 0 行,因此即使日期比较返回行,组合查询也不应该返回任何内容,因为时间比较返回 false。

创建表的脚本:

INSERT INTO [SLIITComDB].[dbo].[Teacher]
           ([TeacherId]
           ,[TeacherName]
           ,[Class]
           ,[Section]
           ,[SubjectId]
           ,[Date]
           ,[ToDate]
           ,[Day]
           ,[StartTime]
           ,[EndTIme]
           ,[Absent])
     VALUES
           (<TeacherId, int,>
           ,<TeacherName, varchar(50),>
           ,<Class, varchar(50),>
           ,<Section, varchar(50),>
           ,<SubjectId, varchar(50),>
           ,<Date, date,>
           ,<ToDate, date,>
           ,<Day, varchar(50),>
           ,<StartTime, time(7),>
           ,<EndTIme, time(7),>
           ,<Absent, varchar,>)
GO

【问题讨论】:

  • 使用的数据类型是日期的日期和时间的列显示时间。没有错误。所以它必须是逻辑错误。
  • 你为什么要检查每个条件两次?

标签: c# asp.net sql sql-server sql-server-2008


【解决方案1】:

在 SQL 中,AND 运算符优先于 OR 运算符。

所以在您的第一个查询中,条件如下所示:

WHERE   
  ( Class = '12' 
    AND Section = 'B' 
    AND '3/4/2013' BETWEEN DATE AND TODATE 
    and '3/14/2013' between Date and ToDate
   ) OR (
    '3/4/2013' < Date and '3/14/2013' > ToDate 
    AND (
            '12:00 PM'  between [StartTime] and endtime 
            and '1:00 PM' between [StartTime] and endtime 
            or ('12:00 PM' < StartTime and '1:00 PM' > EndTIme)
        ))

当顶部或底部(由OR 分隔)为TRUE 时,结果为TRUE

第二个查询中的条件也类似于:

WHERE   
  ( Class = '12'
    AND Section = 'B' 
    and '12:00 PM'  between [StartTime] and endtime 
    and '1:00 PM' between [StartTime] and endtime
   )
    or ('12:00 PM' < StartTime and '1:00 PM' > EndTIme)

即使时间比较都是FALSE,您的第一个查询也可以返回结果,因为您的前两个日期比较可以是TRUE

【讨论】:

    【解决方案2】:

    实际上是你的 OR 导致了这个:

    根据您的数据,或之前的第一部分为真。所以这些将被退回。添加括号以澄清事情。

    正确:

     Class = '12' 
        AND Section = 'B' 
        AND '3/4/2013' BETWEEN DATE AND TODATE 
        and '3/14/2013' between Date and ToDate 
    
     OR
    

    错误:

    '3/4/2013' < Date and '3/14/2013' > ToDate 
        AND (
                '12:00 PM'  between [StartTime] and endtime 
                and '1:00 PM' between [StartTime] and endtime 
                or ('12:00 PM' < StartTime and '1:00 PM' > EndTIme)
            )
    

    试试这个简化的:

    select * 
    from Table1 
    where 1 = 1
    or 2 = 2
    and 1 = 3
    

    【讨论】:

      猜你喜欢
      • 2016-07-26
      • 1970-01-01
      • 1970-01-01
      • 2012-04-24
      • 2015-07-20
      • 1970-01-01
      • 2011-06-06
      • 1970-01-01
      • 2012-03-06
      相关资源
      最近更新 更多