其中日期时间不在 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 join
或 not 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
中没有相应的时间间隔。这似乎是你查询的意图。
我想知道如何 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 join
或 not 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
中没有相应的时间间隔。这似乎是你查询的意图。