比较sql中的多个列

时间:2013-11-20 14:34:42

标签: sql sql-server

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

这样的事情就像我想的那样,我尝试了一些变化,但我的努力没有运气,并在网上查找(也许是因为措辞是通用的)。

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

4 个答案:

答案 0 :(得分:0)

通过比较日期,您应该了解上限。如果您撰写<= "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

答案 1 :(得分:0)

您可能需要以下内容:

如果你想在日期之间找到其中一个:

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

答案 2 :(得分:0)

单程

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

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

答案 3 :(得分:0)

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

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

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

退回位

AS

BEGIN

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

END

然后你就可以像:

一样使用它
SELECT dbo.fnDateTimeBetween('11/01/2012', '11/01/2013', '11/02/2012', '11/02/2012', '11/02/2012')