如何查找两个不同日期字段SQL在一定时间间隔内是不是匹配?

Posted

技术标签:

【中文标题】如何查找两个不同日期字段SQL在一定时间间隔内是不是匹配?【英文标题】:How to find if there is a match in a certain time interval between two different date fields SQL?如何查找两个不同日期字段SQL在一定时间间隔内是否匹配? 【发布时间】:2020-01-09 10:12:53 【问题描述】:

我的事实表中有一个列,它根据以下案例陈述定义供应商是旧的还是新的:

CASE
             WHEN (SUBSTRING([Reg date], 1, 6) = SUBSTRING([Invoice date], 1, 6) 
             THEN ('New supplier')
             ELSE('Old supplier')
END as [Old/New supplier]

因此,例如,如果供应商在 201910 年注册并且发票日期为 201910 年,那么该供应商将被视为该月的“新供应商”。现在我想通过对供应商编号进行不同的计数来计算每个月的旧/新供应商的数量,这不是问题。最后一步很棘手,现在我想计算 12 个月内新/旧供应商的数量(如果在任何滞后的 12 个月内发票日期和注册日期匹配)。所以我创建了以下 mdx 表达式:

aggregate(parallelperiod([D Time].[Year-Month-Day].[Year],1,[D Time].[Year-Month-Day].currentmember).lead(1) : [D Time].[Year-Month-Day].currentmember ,[Measures].[Supplier No Distinct Count])

我面临的问题是它会将供应商编号“1234”计算两次,因为在此期间它既是新的又是旧的。我希望的是,如果它找到一个匹配项,它将被视为该 12 个月期间的“新”供应商。

这就是结果的最终结果,但我希望它对于“旧”而言为零,因为注册日期和发票日期在该 12 个月期间匹配一次,对于 201910 的整个滚动 12 个月,它应该被视为新日期

我们非常感谢任何帮助、可能的方法或想法。

最好的问候, 红宝石

【问题讨论】:

你只想要 mdx 还是 sql 也可以?此外,您的 12 个月期间是如何定义的。我的意思是你得到类似 2 个变量 201811 和 201912 的东西吗? 感谢您的回复!任何一个都可以,我只是想找到一个可能的解决方案:) 【参考方案1】:

首先在供应商级别聚合,然后在类型级别聚合:

select type, count(*)
from (select supplierid,
             (case when min(substring(regdate, 1, 6)) = min(substring(invoicedate, 1, 6))
                   then 'new' else 'old'
              end) as type
      from t
      group by supplierid
     ) s
group by type;

注意:我假设您的日期列采用某种晦涩的字符串格式,以便您的代码正常工作。否则,您应该使用适当的日期函数。

【讨论】:

【参考方案2】:
SELECT COUNT(*) OVER () AS TotalCount
FROM Facts
WHERE Regdate BETWEEN(olddate, newdate) OR InvoiceDate BETWEEN(olddate, newdate) 
GROUP BY
 Supplier

上述查询将返回该时间段内的所有供应商,然后将它们分组。因此 COUNT(*) 将只包括唯一订阅者。

您可能想要更改 WHERE 子句,因为我不太明白您是如何获得 12 个月期限的。通常,如果您的 where 子句在该时间段内返回供应商(它们不必是唯一的),那么 group by 和 count 将处理其余部分。

【讨论】:

mdx 的原因是获得滚动 12 个月,即 201910 将是 (201811-201910) 和 201909 将是 (201810-201909) 等等。所以如果供应商在任何相关期间都是新的该时间段内的几个月,它不仅在匹配的那个月内,而且在整个期间都算作新的。

以上是关于如何查找两个不同日期字段SQL在一定时间间隔内是不是匹配?的主要内容,如果未能解决你的问题,请参考以下文章

如何在特定日期间隔内查找

Vbs获取两个日期天数间隔

SQL记录-PLSQL日期与时间

如何使用间隔 1 分钟在两个日期之间将时间序列数据生成到 Oracle PL/SQL 中的表中?

如何在 Oracle SQL 上进行查询以获取时间间隔,按特定字段分组

检查两个日期间隔是不是相交