Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 选择Datediff获胜的地点';行不通_Sql_Sql Server 2008 R2 - Fatal编程技术网

Sql 选择Datediff获胜的地点';行不通

Sql 选择Datediff获胜的地点';行不通,sql,sql-server-2008-r2,Sql,Sql Server 2008 R2,我有两张桌子VIP和交易 我想获取未过期的值的总和。 过期日期公式为:DATEADD(DAY,VIP.vipValue,[transaction].tDate) where子句必须是这样的: DATEDIFF(DAY,GETDATE(),DATEADD(DAY,VIP.vipValue,[transaction].tDate)) > 0 我试试这个: SELECT SUM(v.vipValue) FROM [transaction] AS t LEFT JOIN VIP AS v

我有两张桌子<代码>VIP和
交易

我想获取未过期的值的总和。
过期日期公式为
DATEADD(DAY,VIP.vipValue,[transaction].tDate)

where子句必须是这样的:

DATEDIFF(DAY,GETDATE(),DATEADD(DAY,VIP.vipValue,[transaction].tDate)) > 0
我试试这个:

SELECT SUM(v.vipValue) 
FROM [transaction] AS t LEFT JOIN
VIP AS v ON  v.vipId = t.vipId
WHERE  DATEDIFF(DAY,GETDATE(),DATEADD(DAY,v.vipValue,t.tDate)) > 0
但它返回的结果是空的;然而,如果我把一些
v.vipValue
(例如:30)放进去,我会得到真实的结果。为什么
v.vipValue
有问题,我哪里做错了

更新帖子 澄清一下,这些是VIP和交易数据

根据注释,应使用v.[timeout]与日期差进行比较,而不是使用v.vipValue

使用表变量的示例代码:


第二个查询将返回5

似乎是与数据相关的问题,可能v.vipValue包含空值。如果您能提供样本数据,我们将不胜感激。我检查了两个表,并且所有数据都没有空值。您是否提供了?如果只选择不带where子句的
DATEADD
部分,是否会得到预期结果(也请提供这些结果)?对于给定的样本数据,
DATEDIFF
将导致负值(-2018年日期为4,2017年日期为369)。(假设日期以yyyy-MM-dd格式显示)。嗯,这不是仅仅因为datediff中使用了v.vipValue,而应该是v.timeout吗?
declare @transaction table (tId int identity(1,1), vipId int, tDate date);

declare @VIP table (vipId int, vipValue int, [timeout] int);

insert into @VIP (vipId, vipValue, [timeout]) values (1,1,1), (2,2,20), (3,3,30);
insert into @transaction (vipId, tDate) values (1,getDate()-1), (2,getDate()-1), (3,getDate()-1), (4,getDate()-1);

SELECT t.*, v.vipValue, v.[timeout], DATEDIFF(DAY,t.tDate,GETDATE()) as DayDiff
FROM @transaction AS t
LEFT JOIN @VIP AS v ON  v.vipId = t.vipId;

SELECT SUM(v.vipValue) 
FROM @transaction AS t
JOIN @VIP AS v ON v.vipId = t.vipId
WHERE v.[timeout] > DATEDIFF(DAY,t.tDate,GETDATE());