我在表格中有3个日期列,创建时,上次修改时以及采取操作的日期。我正在尝试编写一个查询来比较所有这些日期,而不必在3个不同的时间写出来。
这样的事情就像我想的那样,我尝试了一些变化,但我的努力没有运气,并在网上查找(也许是因为措辞是通用的)。
select * from table
where (DateTimeInspected and DateTimeModified and DateTimeCreated) between '11/01/2012' and '11/01/2013'
答案 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
格式,例如yyyymmdd
和BETWEEN
可能无法满足您的需求。
答案 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')