根据文本字段将字段显示为yyyy / mm / dd

时间:2014-08-26 21:58:25

标签: php mysql sorting

使用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

我该如何解决这个问题?

1 个答案:

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