在我的表payments
中,我处理用户已经进行的两次付款&;审判。试用设置为付费,但总额为零(0.00美元),如:
ID | Subscription | Plan | Total | Paid | Paid at | Expires at
1 1 1 0.00 1 null 2020-11-05
当试用版即将过期时,强制用户购买计划,将创建以下行:
ID | Subscription | Plan | Total | Paid | Paid at | Expires at
1 1 1 0.00 1 null 2020-11-05
2 1 1 15.00 1 2020-11-06 2020-12-06
如您所见,total
不再为零,变量paid_at
也被填充。SQL代码应该读取行号2。
我现在需要的是核实上次付款是否过期。但在我们继续之前,请记住以下几点:用户可能选择购买一个计划,但不立即付款,这意味着第一笔付款必须是考虑的那一笔。示例:
ID | Subscription | Plan | Total | Paid | Paid at | Expires at
1 1 1 0.00 1 null 2020-11-05
2 1 1 15.00 0 null 2020-12-06
在这种情况下,用户决定购买该计划,但尚未付款。SQL逻辑应该读取行号1的expires_at
。
当前我的SQL代码如下:
SELECT *
FROM payments
WHERE expires_at < '2020-11-06'
AND paid = true
and subscription_id = 1
ORDER BY id DESC
LIMIT 1
我知道这永远不会起作用,因为它总是获取行号1,无论我是否有更多的行。我也知道,我可以选择最后一行支付,然后通过代码验证它是否已经过期,但我想通过SQL做这件事。
编辑1:SQL Fiddle帮助
我创建了三个表payments
,payments2
,payments3
:
lt;1gt;付款
->;一切正常!
2付款2
->;一切正常!用户还没有付费,所以应该抓取第一行
3Payments3
数据不正确。用户已经付款,因此SQL应该验证最后的expires_at
行
CREATE TABLE `payments` (
`id` int(11) NOT NULL,
`subscription_id` int(11) NOT NULL,
`plan_id` int(11) NOT NULL,
`total` double(10,2) NOT NULL,
`expires_at` date NOT NULL,
`paid` tinyint(1) NOT NULL,
`paid_at` datetime DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
ALTER TABLE `payments` ADD PRIMARY KEY (`id`);
INSERT INTO payments VALUES(1, 1, 1, 0, '2020-11-05', 1, null);
CREATE TABLE `payments_2` (
`id` int(11) NOT NULL,
`subscription_id` int(11) NOT NULL,
`plan_id` int(11) NOT NULL,
`total` double(10,2) NOT NULL,
`expires_at` date NOT NULL,
`paid` tinyint(1) NOT NULL,
`paid_at` datetime DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
ALTER TABLE `payments_2` ADD PRIMARY KEY (`id`);
INSERT INTO payments_2 VALUES(1, 1, 1, 0, '2020-11-05', 1, null);
INSERT INTO payments_2 VALUES(2, 1, 1, 15.00, '2020-12-06', 1, null);
CREATE TABLE `payments_3` (
`id` int(11) NOT NULL,
`subscription_id` int(11) NOT NULL,
`plan_id` int(11) NOT NULL,
`total` double(10,2) NOT NULL,
`expires_at` date NOT NULL,
`paid` tinyint(1) NOT NULL,
`paid_at` datetime DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
ALTER TABLE `payments_3` ADD PRIMARY KEY (`id`);
INSERT INTO payments_3 VALUES(1, 1, 1, 0, '2020-11-05', 1, null);
INSERT INTO payments_3 VALUES(2, 1, 1, 15.00, '2020-12-06', 1, '2020-11-06 15:00:00');
用@NBK的提示解决。在MySQL中,我们不能在where中使用MAX,因此:
SELECT *
FROM `payments`
where subscription_id = 1
and (SELECT MAX(expires_at)
FROM payments
WHERE subscription_id = 1 AND paid = true) < CURDATE()
我使用的是windows应用商店,我使用的是PayPal Windows8 checkout SDK,正常付款可以,但我需要定期付款。让我知道PayPal Windows8 checkout SDK支持定期付款?。 https://github.com/paypal/Windows8SDK
说明 微信支付-查询企业付款到零钱SDK。 官方文档:https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_3 类 请求参数类 请求参数 类名:\Yurun\PaySDK\Weixin\CompanyPay\Weixin\Query\Request 属性 名称 类型 说明 $_apiMethod string 接口名
说明 微信支付-查询企业付款到银行卡SDK。 官方文档:https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=24_3 类 请求参数类 请求参数 类名:\Yurun\PaySDK\Weixin\CompanyPay\Bank\Query\Request 属性 名称 类型 说明 $_apiMethod string 接口名称
问题内容: 很久以前,我正在使用反射创建一个迷你ORM。 这完全有道理,我退出了我的小命令,并增强了CTRL + C,CTRL + V键(lib的目的是避免为我正在使用的Web应用程序中的不同表重复重写相同的代码段) 几年后,由于某种原因,我现在不记得(也不想记住)我正在阅读(或试图…)Hibernate源代码,因为我想知道他们是否使用AOP即时生成代码并避免反射惩罚,但令我惊讶的是,我所看到的全
我正在使用PayPal快速结帐,我需要做的是稍后单独授权和捕获付款,我目前的PayPal流程是, 1) 我使用以下代码创建付款: Paypal将订单信息和重定向返回给我,我将用户重定向到
EasyWeChat 4.0.7+ 该模块需要用到双向证书,请参考:https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=4_3 企业付款到用户零钱 $app->transfer->toBalance([ 'partner_trade_no' => '1233455', // 商户订单号,需保持唯一性(只能是字母或
问题内容: 通过TCP流发送()/ write()消息时,如何确定这些字节是否已成功传递? 接收方通过tcp确认接收到字节,因此发送方tcp堆栈应该知道。 但是当我send()一些字节时,即使无法发送数据包,send()也会立即返回,我在netcat上使用strace在linux 2.6.30上进行了测试,在发送一些字节之前先拔出网络电缆。 我只是在开发一个应用程序,在该应用程序中了解消息是否已传
在Java中,我如何判断 Stripe 中的卡是否是默认支付选项?例如: 或者,我可以查询默认付款来源吗? 我问这个问题的原因是因为我想向客户显示一张卡的最后4位数字,以向他们显示他们当前默认的支付选项。但如果有多张卡,我怎么知道?