如果(DateDiff)中的EndDate为空,则使用Today

时间:2019-01-15 17:22:52

标签: sql sql-server

如果没有相应的结束日期,我将无法确定OBJNR处于特定状态的时间。由于状态仍处于活动状态,结果为“ 0”。我想使用今天的当前日期来计算对象编号处于该状态的时间。请参阅下面的当前结果。

int reverse_convert(int64_t y) {
    if (y == 1)
        return (1 - y) << 16 - 1; // However, either x = 0 or x = 1 can produce this result.
    else
        return (1 - y) << 16;
    // the condition of y == 0, corresponding to the original "else return 0;", is ignored.
}

预期结果是没有结束日期的地方,我可以使用今天的日期来计算日期差异公式。结果为“ 0”的相应状态中没有相应的结束日期。

当前,这是结果:

convert

2 个答案:

答案 0 :(得分:1)

COALESCE函数可用于将当前日期GETDATE()替换为空值。也可以使用ISNULL函数完成此操作,但是COALESCE是ANSI标准,允许在必要时在更多数据库平台上使用。从您的问题来看,您似乎只想在此列中的所有值均为空时才使用当前日期,因此COALESCEMAX函数之外。如果要用当前日期替换任何空值,则将它们与非空值进行比较,COALESCE函数将需要放置在MAX内。

(
SELECT 
JCDS_SOGR.OBJNR, JCDS_SOGR.STAT, TJ02T.TXT30, DATEDIFF(DAY,MIN(JCDS_SOGR.UDATE), COALESCE(MAX(JCDS_SOGR.UDATE), GETDATE()))
AS DIF
FROM JCDS_SOGR
JOIN TJ02T ON JCDS_SOGR.STAT = TJ02T.ISTAT
WHERE JCDS_SOGR.OBJNR = 'IE000000000010003791'
AND TJ02T.SPRAS = 'E'
GROUP BY JCDS_SOGR.OBJNR,JCDS_SOGR.STAT,TJ02T.TXT30) 

UNION ALL

(
SELECT JCDS_SOGR.OBJNR, JCDS_SOGR.STAT, TJ30T.TXT30, DATEDIFF(DAY,MIN(JCDS_SOGR.UDATE), COALESCE(MAX(JCDS_SOGR.UDATE), GETDATE()))
AS DIF
FROM JCDS_SOGR
JOIN TJ30T ON JCDS_SOGR.STAT = TJ30T.ESTAT
WHERE JCDS_SOGR.OBJNR = 'IE000000000010003791'
AND TJ30T.SPRAS = 'E'
AND TJ30T.MANDT='400'
AND TJ30T.STSMA = 'VEHICLE'
GROUP BY JCDS_SOGR.OBJNR,JCDS_SOGR.STAT,TJ30T.TXT30)

答案 1 :(得分:0)

SELECT COUNT(*) as COUNT, JCDS_SOGR.OBJNR, JCDS_SOGR.STAT, TJ30T.TXT30, DIF =
CASE
  WHEN COUNT(*) > 1 THEN DATEDIFF(DAY,MIN(JCDS_SOGR.UDATE),MAX(JCDS_SOGR.UDATE))
  WHEN COUNT(*) = 1 THEN DATEDIFF(DAY,MIN(JCDS_SOGR.UDATE),GETDATE())
END
FROM JCDS_SOGR
JOIN TJ30T 
ON JCDS_SOGR.STAT = TJ30T.ESTAT
WHERE JCDS_SOGR.OBJNR = 'IE000000000010003137'
AND TJ30T.SPRAS='E'
AND TJ30T.MANDT='400'
AND STSMA = 'VEHICLE'
GROUP BY JCDS_SOGR.OBJNR, JCDS_SOGR.STAT, TJ30T.TXT30