SQL - 比较表中的日期

Posted

技术标签:

【中文标题】SQL - 比较表中的日期【英文标题】:SQL - Comparing dates in a table 【发布时间】:2016-03-29 13:35:20 【问题描述】:

如何使用SQL从原表中获取修改后的表?基本上,我想做的是根据日期比较客户数据的行。在一个月内 15 天内购买任何商品的客户将被视为进行 1 次购买。例如,对于客户 Paolo Arcotti,虽然他在 15 天内进行了 3 次购买,但仅考虑了第一次购买并计为 1 次购买;而对于客户 Hanna Moss,这被视为 2 次购买。简而言之,我想将 1 月 1 日至 15 日的购买归类为 1 次购买,16-30 日为另一次购买。

Original Table vs Revised Table

【问题讨论】:

请用您正在使用的数据库标记您的问题。 你已经尝试过什么?另外您使用的是什么数据库技术? 【参考方案1】:

数据库支持日期函数,但每个数据库都不同。以下方法使用not exists 和函数来表示日期的日、月和年:

select t.*
from original as t
where not exists (select 1
                  from original as t2
                  where t2.customer = t.customer and
                        datepart("yyyy", t2.date) = datepart("yyyy", t.date) and
                        datepart("m", t2.date) = datepart("m", t.date) and
                        t2.date < t.date and
                        ((datepart("d", t2.date) <= 15 and datepart("d", t.date) <= 15) or
                         (datepart("d", t2.date) > 15 and datepart("d", t.date) > 15)
                        )
                 );

【讨论】:

如何进一步从上述结果中删除重复项?使用上面的代码时,我注意到一个小错误。例如,如果同一客户在同一天进行了 3 次购买,由于第 8 行 -t2.date @saturday 。 . .每行的唯一标识符将有助于删除此类重复项。你想问另一个关于样本数据和期望结果的问题吗?【参考方案2】:
;with cte as 
(
select *,DATEPART(d,orderdate) as dayofmonth1,row_number() over(partition by customer order by customer,orderdate ) as rn from #test 
where DATEPART(d,orderdate)<=15
)
, cte1 as
(
select *,DATEPART(d,orderdate) as dayofmonth1,row_number() over(partition by customer order by customer,orderdate )as rn from #test 
where DATEPART(d,orderdate)>15
)
select *from cte where rn=1
union select *from cte1 where rn=1

【讨论】:

以上是关于SQL - 比较表中的日期的主要内容,如果未能解决你的问题,请参考以下文章

SQL比较2个日期并在> 3天时显示在表中

比较特定位置的两个日期之间的日期

比较表格中的日期和表格中的日期

将表中的日期与 TableAU 中的多个日期范围进行比较:构建 WHERE 语句

access中的日期比较

比较从 Windows 窗体中的 TextBox 获得的日期值与 Excel 表中存储的日期值