【问题标题】:get alle events where date is in the past获取过去日期的所有事件
【发布时间】:2021-06-10 11:16:40
【问题描述】:

我有一个带有“事件”表的 mysql 数据库。 我通过以下方式获取所有数据:

SELECT * FROM `events`

有一列“start”具有此值(示例)

20210501T180000

定义:

YYYYMMDDTHHIISS

现在我想获取日期“开始”与今天的差异为

例如:

start = 20211005T180000
today = 20211006T100000
=>  -1 day difference

时间不应该是一个因素。

【问题讨论】:

  • 您的专栏为什么不使用datedatetime 类型?那么比较将只是与 now() 进行比较的情况
  • 不适合我的情况
  • 真的吗?我从未遇到过将日期存储为字符串的用例。你认为你得到了什么?因为你失去了很多。这些类型的存在是有充分理由的。
  • @Adyson 这可能只是出于遗留原因,在一个已经开发了十多年并且具有足够的依赖性以至于 OP 无法更改的项目中 - 这个问题仍然有一个直接的答案。
  • @nos 也许,也许不是。如果这是一项新工作,那么从长远来看,改用 datetime 列会比进行字符串比较更好,也更有效。这就是为什么我问 OP 的原因。

标签: mysql datetime


【解决方案1】:

今天是 6 月 10 日...

DROP TABLE IF EXISTS my_bad_data;

CREATE TABLE my_bad_data
(bad_date CHAR(15));

INSERT INTO my_bad_data VALUES
('20210501T180000'),
('20210610T180000');

SELECT * 
  FROM my_bad_data 
 WHERE DATE(STR_TO_DATE(bad_date,'%Y%d%mT%H%i%s')) < CURDATE();

+-----------------+
| bad_date        |
+-----------------+
| 20210501T180000 |
+-----------------+

正如 OJ 所提到的,如果您可以修复您的架构,那么您应该这样做。

【讨论】:

  • 请注意:如果您的日期以标准格式存储,您可以执行WHERE date &lt; CURDATE() 之类的操作。这很好,因为它易于阅读,并且可以利用date 列上的索引。您将可以使用dbms's date/time arithmetic functions
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多