我有3个表,其中一列名为created
,类型为日期时间。
我正在寻找一种方法来检查所有3个创建的日期列(今天和今天-7之间),如果找到日期,如果没有,结果应为1,0。
此SQL FIDDLE是我迄今为止所拥有的。它应该返回1,但它返回0,而不是。
SELECT
CASE
WHEN(
(
table1.created BETWEEN DATEDIFF(dd, 7, GETDATE()) AND GETDATE() AND
table2.created BETWEEN DATEDIFF(dd, 7, GETDATE()) AND GETDATE() AND
table3.created BETWEEN DATEDIFF(dd, 7, GETDATE()) AND GETDATE()
)
)
THEN
1
ELSE
0
END AS FLAG
FROM
table1,
table2,
table3
WHERE
table1.cond1= 'A' and
table2.cond1= 'A' and
table3.cond1= 'A'
答案 0 :(得分:3)
将DATEDIFF
更改为DATEADD
,将7
更改为-7
,将AND
更改为OR
:
SELECT
CASE
WHEN(
(
table1.created BETWEEN DATEADD(dd, -7, GETDATE()) AND GETDATE() OR
table2.created BETWEEN DATEADD(dd, -7, GETDATE()) AND GETDATE() OR
table3.created BETWEEN DATEADD(dd, -7, GETDATE()) AND GETDATE()
)
)
THEN
1
ELSE
0
END AS FLAG
FROM
table1,
table2,
table3
WHERE
table1.cond1= 'A' and
table2.cond1= 'A' and
table3.cond1= 'A'
答案 1 :(得分:1)
在SQL中,“今天 - 7”是DATEADD(dd, -7, GETDATE())
。你有什么,DATEDIFF(dd, 7, GETDATE())
是第7天和今天之间的差异,用天来衡量。
答案 2 :(得分:1)
要检查表格是否有符合特定条件的行,您可以使用EXISTS
predicate:
SELECT
CASE
WHEN EXISTS (SELECT * -- syntactically, the select list is disregarded here
-- meaning you can replace the "*" with anything else
FROM tablename
WHERE ...
)
THEN 1
ELSE 0
END
-- no FROM clause in the main SELECT
;
如果要同时检查多个表,请创建几个谓词,如下所示:
SELECT
CASE
WHEN EXISTS (SELECT * FROM table1 WHERE ...)
AND EXISTS (SELECT * FROM table2 WHERE ...)
AND EXISTS (SELECT * FROM table3 WHERE ...)
THEN 1
ELSE 0
END
;
最后,其他回答者所说的内容也适用,即您应该考虑更改日期检查条件
created BETWEEN DATEDIFF(dd, 7, GETDATE()) AND GETDATE()
到
created BETWEEN DATEADD(dd, -7, GETDATE()) AND GETDATE()
原始表单在您的情况下也会起作用,但它依赖于int
到datetime
的隐式转换,这不是一个好习惯,如果您更改{{1从created
到其中一种较新的类型,datetime
或datetime2
或者datetimeoffset
。