【问题标题】:SQL query to match whole number of weeksSQL查询以匹配整数周数
【发布时间】:2014-11-03 06:29:41
【问题描述】:

我正在设置定期计费处理器*。客户希望能够设置客户可以选择每两周进行一次计费,也就是每两周一次。

我可以尝试自己计算“下一个”付款日期,但记录第一个付款日期似乎更可靠,然后使用 SQL 查询计算“今天是第一个付款日期后的 2 N 周”日期”。

select * from recurring_payments
where (datediff(first_billing_date, now() % 14) = 0

但是,这样做的缺点是进行(可能)不可索引的全表扫描。有没有更好的方法来查找字段匹配 2N 天前的行?

这最初是在 MySQL 中,但几周后会转移到 MSSQL,因此通用方法会比定制功能更好。

*是的,我很害怕。

【问题讨论】:

  • 您使用的是哪个 RDBMS?例如,SQL Server 有 DATEPART(week, @date)。但是,我使用过的大多数财务软件都配置了可配置的支付期日期。有一个支付期限表,其中包含年份、支付期限、开始和结束日期。通常有一种方法可以自动配置它们,但系统允许您根据需要配置支付期间的特定日期。毕竟,您不知道何时会进行年终展期。
  • "记录第一个付款日期,然后使用SQL查询计算'今天是第一个日期后的2 N周',似乎要可靠得多。" 也许不是。如果计算出的日期正好是圣诞节,会发生什么?还是周日?
  • 您可以添加一个数字从 1 到 14 的指标,用于指示付款“周期”
  • @MikeSherrill'CatRecall' 在线支付系统在周日和其他节假日可用。
  • @FabienTheSolution 然后呢?

标签: sql datetime recurring-billing recurring


【解决方案1】:

所以,就像我说的,您可以添加一个数字从 1 到 14 的指标,以指示付款“周期”。

因此,您将有 14 个周期,您只需要检索那些在您今天的周期中的周期...在我的示例中为 8 个,因为我们是 9 月 9 日。

SQL Fiddle

MySQL 5.5.32 架构设置

CREATE TABLE recurring_payments
    (`clientid` int, `first_billing_date` date, `cycle` int)
;

INSERT INTO recurring_payments
    (`clientid`, `first_billing_date`, `cycle`)
VALUES
    (1, '2014-08-19', 1),
    (2, '2014-08-21', 3),
    (3, '2014-08-23', 5),
    (4, '2014-08-25', 7),
    (5, '2014-08-26', 8),
    (6, '2014-08-27', 9),
    (7, '2014-08-29', 11),
    (8, '2014-08-30', 12),
    (9, '2014-09-01', 14),
    (10, '2014-09-02', 1),
    (11, '2014-09-03', 2),
    (12, '2014-09-05', 4),
    (13, '2014-09-06', 5),
    (14, '2014-09-07', 6),
    (15, '2014-09-08', 7)
;

查询 1

select *
from recurring_payments
where cycle = 8 and first_billing_date < curdate()

Results

| CLIENTID |            FIRST_BILLING_DATE | CYCLE |
|----------|-------------------------------|-------|
|        5 | August, 26 2014 00:00:00+0000 |     8 |

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-21
    • 2012-02-09
    • 1970-01-01
    • 1970-01-01
    • 2019-06-17
    • 2021-10-08
    相关资源
    最近更新 更多