mysql日期时间范围选择

时间:2012-03-29 09:43:09

标签: mysql datetime cron

我在系统中有定期付款方式。一切都很好,API成功响应记录在数据库中。 我的问题是,我即将自动化系统的后续付款操作(不幸的是,支付网关不支持)。 通过cron,我将安排检查后续流程和通知中是否必须包含哪些帐户。 我这里有一个数据库条目:

+---------------------+---------------------+--------------------+
| payment_date        | payment_expirydate  | transaction_number |
+---------------------+---------------------+--------------------+
| 2012-02-14 03:47:15 | 2012-05-14 03:47:15 | 1-67815163         |
| 2012-02-16 00:53:03 | 2012-05-16 00:53:03 | 1-69010235         |
| 2012-02-16 08:57:16 | 2012-05-16 08:57:16 | 1-69027483         |
| 2012-02-16 09:08:06 | 2012-05-16 09:08:06 | 1-69027694         |
| 2012-02-16 09:58:17 | 2012-05-16 09:58:17 | 1-69028921         |
| 2012-02-17 09:28:32 | 2012-05-17 09:28:32 | 1-69072076         |
| 2012-02-17 06:17:45 | 2012-05-17 06:17:45 | 1-69068200         |
| 2012-02-17 11:12:08 | 2012-05-17 11:12:08 | 1-69074788         |
+---------------------+---------------------+--------------------+

我在为此创建SQL查询时遇到了困难。假设今天的日期 2012-05-16 ,时间 07:00:00 。我希望得到今天所有的帐户,而不是当前的时间。例如,我需要的唯一有效帐户(基于我指示的当前日期和时间)是帐户 1-69010235

此外,如果我应该在什么时间间隔设置我的cron来运行任何提示?

3 个答案:

答案 0 :(得分:6)

此查询将返回今天到期的所有记录 -

SELECT *
FROM accounts
WHERE payment_expirydate BETWEEN CURRENT_DATE AND (CURRENT_DATE + INTERVAL 1 DAY - INTERVAL 1 SECOND)

如果您希望所有帐户今天过期但少于当前时间 -

SELECT *
FROM accounts
WHERE payment_expirydate BETWEEN CURRENT_DATE AND CURRENT_TIMESTAMP

对于codeigniter的AR实现,您应该能够使用 -

$this->db->where('payment_expirydate BETWEEN CURRENT_DATE AND CURRENT_TIMESTAMP', NULL, FALSE);

答案 1 :(得分:3)

SELECT group_concat(transaction_number) as transaction_number
FROM tab
WHERE payment_date BETWEEN CURRENT_DATE AND CURRENT_TIMESTAMP

您可以使用它来返回一个字符串,并使用perl分割字符串并传递给curl。

sqlfiddle here

答案 2 :(得分:1)

如果您希望表格中显示的所有记录对当前时间有效 - 而有效则表示payment_date早于现在且payment_expirydate晚于现在,您可以使用:

SELECT transaction_number from `table`
WHERE payment_date > now()
AND payment_expirydate < now();

这会得到你想要的吗?