Sql 选择Datediff获胜的地点';行不通
我有两张桌子<代码>VIP和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
交易
我想获取未过期的值的总和。
过期日期公式为:
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());