我有" varchar"我的数据库中存储了以下记录的字段:
(11.1.2015) Log info 1
(17.4.2015) Log info 2
(22.5.2015) Log info 3
(25.5.2015) Log info 3
...
现在我想使SELECT WHERE日期在inside()中与今天相同或更大并选择第一个(所以在这个样本和今天的日期我应该得到22.5.205)。我无法弄清楚如何做到这一点,所以我需要一些帮助。
答案 0 :(得分:1)
原则上我同意Pekka웃就此问题 您应该始终努力为您的数据使用正确的数据类型 这也意味着从不使用一列来存储2个不同的数据段。
然而,从对Pekka comments的回答的评论中我明白改变桌子是不可能的,所以这是我尝试这样做的。
假设您的日期始终位于varchar的开头,并且始终用括号括起来,您可以执行以下操作:
SELECT *
FROM (
SELECT
CAST(SUBSTR(Log_data, 2, LOCATE(')', Log_data)-1) as date) LogDate,
SUBSTR(Log_data, LOCATE(')', Log_data)+1, CHAR_LENGTH(Log_data)) LogData
FROM logs_table
) NormalizedLogTable
WHERE LogDate >= CURDATE()
Limit 1
注意#1 :这是针对您的具体情况的解决方法 如果你有机会,你应该将你的桌子正常化。
注意#2 我不是MySql人。我的大部分SQL经验都是使用Sql server
您可以找到一种更好的方法,将字符串转换为日期,然后只使用cast
,以克服1.3.2015
等值的模糊性。
答案 1 :(得分:0)
这很可能与varchar字段无关,或者非常复杂。虽然理论上你可以在mySQL中使用正则表达式函数来匹配模式,但是你正在寻找一个日期范围。即使有可能以某种方式构建查询,它也将是一大堆工作,并且mySQL无法针对它的任何方面进行优化。
正常,快速,直接的方法是normalizing your table.
在您的情况下,您可能会创建一个名为" logs"并通过ID字段将其连接到现有表,该ID字段显示每个日志条目属于哪个父记录。
查询属于特定父级的日志条目的特定日期范围,然后变得如
一样简单$('.popup').magnificPopup({
midClick: true,
type: 'ajax'
});
首先要做的很痛苦(因为你必须重建部分结构和可能的应用程序),并使日常查询变得更复杂,但这样的情况变得更容易和更快。