我有以下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'
答案 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
。
这仅适用于DATE
,DATETIME
和TIMESTAMP
列,这就是due_date
应存储的方式,最好是DATE
。
<强>更新强>
要将VARCHAR
列转换为DATE
run:
UPDATE tasks SET due_date=STR_TO_DATE(due_date,'%m/%d/%Y')
然后更改类型。另请记住更改INSERT
语句以使用默认格式。