繁体   English   中英

比较SQL中的多列

[英]Compare multiple columns in sql

我在表中有3个日期列,创建,最后修改和采取操作的日期。 我正在尝试编写一个查询,比较所有这些日期,而不必将其写出3次不同的时间。

我想是这样的,我尝试了一些变体,但是我的努力并没有在网上找到它(这可能是因为通用的措辞)。

select * from table     
where (DateTimeInspected and DateTimeModified and DateTimeCreated) between '11/01/2012' and '11/01/2013'

通过比较日期,您应该了解上限。 如果您写<= "2013-11-20" ,将不会获得日期为2013-11-20任何数据。 因此,您必须编写<= "2013-11-20 23:59:59"甚至更好的< "2013-11-21"

接下来,您必须为要检查的每一列扩展where和use之间的位置:因此,SQL查询应如下所示:

SELECT * FROM table     
WHERE DateTimeInspected BETWEEN '11/01/2012' AND '11/01/2013'
    AND DateTimeModified BETWEEN '11/01/2012' AND '11/01/2013' 
    AND DateTimeCreated BETWEEN '11/01/2012' AND '11/01/2013' 

注意: column BETWEEN value1 AND value2之间的column >= value1 AND column <= value2等于column >= value1 AND column <= value2

您可能想要以下内容:

如果要在日期之间选择其中之一:

SELECT YourField
FROM TABLE
WHERE (DateTimeInspected BETWEEN '11/01/2012' AND '11/01/2013')
OR (DateTimeModified BETWEEN '11/01/2012' AND '11/01/2013')
OR (DateTimeCreated BETWEEN '11/01/2012' AND '11/01/2013')

不过请注意DateTime字段和BETWEEN,因为您未在'11 / 01/2013'中指定时间,因此SQL会假设您的意思是'11 / 01/2013 00:00:00'。 如果开始日期和结束日期是参数,则可以根据需要添加一天来解决此问题。

OR (DateTimeCreated BETWEEN '11/01/2012' AND DATEADD(day, 1, '11/01/2013') )

单程

SELECT *
FROM   YourTable
WHERE  EXISTS (SELECT *
               FROM   (VALUES(DateTimeInspected),
                             (DateTimeModified),
                             (DateTimeCreated)) V(D)
               WHERE  V.D >= '20121101'
                      AND V.D < '20131101') 

您应该使用明确的datetime格式,例如yyyymmddBETWEEN可能无法满足您的需求。

我想这个问题是关于如何一次优化3个日期的检查边界。

在这种情况下,可以创建自己的特定内联函数来验证所需条件。 它将允许您重用该功能,并有可能在单个位置进行更改:

CREATE FUNCTION [dbo].[fnDateTimeBetween](
@startDate datetime,
@endDate datetime,
@datetime1 datetime,
@datetime2 datetime,
@datetime3 datetime)

返回位

开始

DECLARE @result bit = 0

SELECT @result = 1
WHERE @datetime1 BETWEEN @startDate AND @endDate
    AND @datetime2 BETWEEN @startDate AND @endDate
    AND @datetime3 BETWEEN @startDate AND @endDate

RETURN @result

结束

然后,您将可以像这样使用它:

SELECT dbo.fnDateTimeBetween('11/01/2012', '11/01/2013', '11/02/2012', '11/02/2012', '11/02/2012')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM