varchar中的MySql日期(选择正确的日期)?

时间:2015-05-07 06:16:02

标签: mysql sql select

我有" 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)。我无法弄清楚如何做到这一点,所以我需要一些帮助。

2 个答案:

答案 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

See sql fiddle here.

注意#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'
});

首先要做的很痛苦(因为你必须重建部分结构和可能的应用程序),并使日常查询变得更复杂,但这样的情况变得更容易和更快。