2

我有一个 MySQL 数据库表,其中一个单元格包含多个日期,我想选择包含一个或多个日期大于今天日期的单元格的所有行,这可能吗?(使用 PHP)

4

4 回答 4

2

当然:

select * from MyTable where MyDate > Now()

您的单个字段如何包含多个日期?也许您应该为此考虑一个单独的表。

于 2013-11-13T00:20:39.023 回答
1

“单个单元格包含多个日期”.. 是问题的症结所在。这里有三个选项。

规范化/修复架构

从一个充分规范化的模式开始 - 特别是,任何列/“单元格”最多可以有一个日期(或一条信息)。根据信息的作用,这可能需要也可能不需要引入另一个表。

这种方法是可扩展的,并且在 RDMBS/RA 设计中工作,如果完成,其他查询将“正常工作”。

(这是迄今为止总体上最好的选择,如果可能的话,应该这样做。适当的规范化还应该指导进一步的模式开发,以在未来缓解此类问题。)

创建标准化视图

创建可以JOIN编辑的非规范化表(或此类规范化查询)的规范化视图。然后使用各种建议的答案之一(适用于规范化模式)..尽管存在无法利用索引的极端劣势。

这非常混乱,但可以做到。看到SELECT 非规范化列到单独的记录中吗?例如。(注意这里合成的行关系,虽然一些[非 MySQL] 数据库也支持表值函数和此类的跨应用程序。)

这种方法无法扩展,因为它不能使用索引。

在客户端过滤(PHP)

获取每一行。循环和使用explode等,视情况而定。

由于缺少索引并且需要在本地获取所有数据,这种方法无法扩展。


虽然可以通过各种技巧(例如FIND_IN_SET)在非规范化列中找到相等的值,但使用相同的技术无法找到相对(即更大/更小)的值。在这两种情况下都有效的解决方案是修复底层架构。

于 2013-11-13T00:34:29.057 回答
1

如果该字段是 aDATE或者DATETIME您可以使用

SELECT * FROM table WHERE datefield > NOW()
于 2013-11-13T00:20:32.770 回答
0

如果你只在 aDATE而不是 aDATETIME你可以使用CURDATE()而不是NOW()

于 2013-11-13T00:24:13.083 回答