其中日期时间不在 Select 之间

Where Datetime NOT IN Between Select

我想知道如何 select 我的日期时间不在 select 之间的一些行。

我当前的 Select 看起来像这样:

SELECT LOG.*
FROM LOG
WHERE   LOG.[date]      >=  @startDate
AND     (LOG.[date]     <=  @endDate OR @endDate IS NULL)
AND     LOG.[date] NOT IN BETWEEN ANY PAIR FROM (SELECT ADMINaction.Start,ADMINaction.Ende 
                               FROM ADMINaction 
                               WHERE     ADMINaction.Start      >=  @startDate
                               AND      (ADMINaction.Ende   <=  @endDate OR @endDate IS NULL))

但这不是一个有效的查询。

我需要如何修改它才能使其有效?


编辑

Q: Would that sub-query always return only one result?

A: NO, the sub-query can contain any number of results

如果您 100% 确定用于确定开始日期和结束日期的查询仅 returns 一条记录,则可以执行此操作(可以肯定的是,您可以包含 TOP 1在内部 SELECT):

SELECT *
FROM LOG CROSS JOIN
    (SELECT Start,Ende 
     FROM ADMINaction 
     WHERE     [date]     >=  @startDate
     AND      ([date]     <=  @endDate OR @endDate IS NULL)
) DateFilter
WHERE   LOG.[date]      >=  @startDate
AND     (LOG.[date]     <=  @endDate OR @endDate IS NULL)
AND     LOG.[date] NOT BETWEEN DateFilter.Start AND DateFilter.Ende

如果您的 ADMINaction table 仅包含 1 条记录,您可以将此查询简化为:

SELECT *
FROM LOG CROSS JOIN ADMINaction
WHERE   [date]      >=  @startDate
AND     ([date]     <=  @endDate OR @endDate IS NULL)
AND     [date] NOT BETWEEN Start AND Ende

据推测,您想要 left joinnot exists:

SELECT l.*
FROM LOG l
WHERE l.[date] >=  @startDate AND
      (l.[date] <=  @endDate OR @endDate IS NULL) AND
      NOT EXISTS (SELECT 1
                  FROM ADMINaction a
                  WHERE l.[date] >= a.Start AND
                        (l.[date] <= a.Ende OR a.Ende IS NULL)
                 );

这 returns 来自 log 的行,其中日志日期在 ADMINaction 中没有相应的时间间隔。这似乎是你查询的意图。