日期之间的mysql查询不起作用

时间:2014-08-13 15:12:46

标签: mysql sql

我有以下mysql表:

tasks:
=====================
tid
status
desc
duedate

我在该表中有以下记录:

records
===========================
1
active
Test description
08/15/2014

2
active
Another description
08/31/204

我想在那个特定的月份里找到有任务的日子。我有以下查询但是当我运行它时它获得两个记录,但由于某种原因“天”在它们两个上都是空的。有人可以帮我解决这个问题。

MYSQL QUERY
====================
SELECT DATE_FORMAT(due_date,'%d') AS day FROM tasks WHERE due_date BETWEEN '08/01/2014' AND '08/31/2014'

2 个答案:

答案 0 :(得分:2)

你必须转换那些" date"使用STR_TO_DATE将字符串转换为正确的日期值:

SELECT 
   DAY(STR_TO_DATE(due_date,'%m/%d/%Y')) AS day 
FROM tasks 
WHERE 
  STR_TO_DATE(due_date, '%m/%d/%Y') 
  BETWEEN STR_TO_DATE('08/01/2014' '%m/%d/%Y') 
  AND STR_TO_DATE('08/31/2014', '%m/%d/%Y')

否则你要比较字符串。

注意:

最好使用正确的DATE或DATETIME列 使用当前的VARCHAR格式,MySQL无法使用索引。这对性能非常不利。

您可以通过在表格中添加其他列来转换数据:

ALTER TABLE tasks
ADD COLUMN new_due_date DATE;

然后使用UPDATE语句填充此新列

UPDATE tasks
SET new_due_date = STR_TO_DATE(due_date, '%m/%d/%Y');

如果您不再需要旧列,则可以删除此列并修改新列以获得旧列的名称。然后,您将在DATE列中显示包含所有数据的表格。

答案 1 :(得分:2)

尝试:

 SELECT DAY(due_date) AS day 
   FROM tasks 
  WHERE due_date >= '2014-08' 
    AND due_date < '2014-09';

DAY()是您想要的更好的功能,我更喜欢使用>=<而不是BETWEEN进行日期比较,因为它允许您指定更精确的范围容易。例如,您不需要知道该月的天数。

我还使用了默认日期格式,这是首选。如果您需要使用美国日期格式,请在DATE_FORMAT()中使用SELECT

这仅适用于DATEDATETIMETIMESTAMP列,这就是due_date应存储的方式,最好是DATE

<强>更新

要将VARCHAR列转换为DATE run:

UPDATE tasks SET due_date=STR_TO_DATE(due_date,'%m/%d/%Y')

然后更改类型。另请记住更改INSERT语句以使用默认格式。