2

これが私の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
4

2 に答える 2

3

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)
        ))

結果はTRUE、上または下のセクション ( で区切られてORいる)のいずれかが の場合TRUEです。

2 番目のクエリの条件も次のようになります。

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の 2 つの日付比較はTRUE.

于 2013-03-04T12:21:05.123 に答える
1

実際、これを引き起こすのはあなたのORです:

or の前の最初の部分は、データによると true です。したがって、これらは返されます。括弧を追加して、物事を明確にします。

真実:

 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
于 2013-03-04T12:22:10.877 に答える