使用PHP和MySQL,我有一个事件表,按照名为sort_date的字段排序,格式为yyyy / mm / dd。
我需要在页面上显示一个start_date:月dd(例如11月7日)。
所以我将start_date和end_date字段最初设置为datepicker。但是一旦输入了记录,我就必须进入并手动更改日期格式:月份dd。但是这并没有按升序排序日期,所以我有一个Sort_date字段......这是yyyy / mm / dd格式。
我想在我的页面上列出这样的事件:
8月27日 时间 哪里 地址 描述
这是有效的,但是现在我将开始和结束日期更改为Text,sort_date字段不会读取信息。
所以我的问题是,如何让sort_date字段读取TEXT start_date字段中的内容并将其显示为yyyy / mm / dd?
这是我的sql语句:
SELECT *
FROM events
WHERE DATE_FORMAT(sort_date, '%Y-%m-%d') >= Date_Format(Now(), '%Y-%m-%d')
AND authorize = 1
ORDER BY sort_date
我该如何解决这个问题?
答案 0 :(得分:1)
这需要两个步骤。
首先,您需要将文本列日期转换为DATE
表达式。
您可以使用,例如,
STR_TO_DATE('2014/11/18', '%Y/%m/%d')
然后,您可以操纵DATE
表达式,对其进行排序,或对其进行格式化,或者您需要做什么。要从上面的表达式中获取November 2014
,请执行以下操作:
DATE_FORMAT(STR_TO_DATE('2014/11/18', '%Y/%m/%d'), '%M %Y')
要从该表达式获取包含11月中的第一天(该月的第一天)的DATE
值,您可以执行此操作。
DATE(DATE_FORMAT(STR_TO_DATE('2014/11/18', '%Y/%m/%d'), '%Y-%m-01'))
关键是您应该将基于字符串的日期转换为DATE
表达式,因为这样可以使用各种有用的日期算术运算。
要处理问题中的WHERE
子句,请执行以下操作:
WHERE STR_TO_DATE(sort_date, '%Y/%m/%d') >= NOW()
要处理ORDER BY
子句,您可以执行以下操作:
ORDER BY STR_TO_DATE(sort_date, '%Y/%m/%d')
这里有危险。如果您的某些日期字符串格式错误,则MySQL日期转换将以静默方式返回NULL。所以,我会使用以下ORDER BY
子句,然后仔细查看输出,至少一次
ORDER BY STR_TO_DATE(sort_date, '%Y/%m/%d') NULLS FIRST