我想在01/01/2008和31/10/2008之间列出所有产品。 mysql中的产品输入日期以10位格式输入。这是我尝试的sql,但是它返回表中的所有数据并忽略了日期比较:
SELECT productid, productname
FROM products
WHERE FROM_UNIXTIME(entry_date,'%d/%m/%Y') BETWEEN '01/01/2008' and '31/12/2008'
我做错了什么?
答案 0 :(得分:1)
两个提示:
将这些放在一起,您的查询应如下所示:
SELECT productid, productname
FROM products
WHERE entry_date BETWEEN UNIX_TIMESTAMP('2008-01-01') AND UNIX_TIMESTAMP('2009-01-01')
使用本机日期格式意味着您不必使用格式化选项来玩游戏。但是在这个查询中,更大的胜利是将计算放入比较的常数部分。这是一个胜利,因为MySQL只需要进行一次计算,而不是在它正在查看的每一行。这也意味着它可以使用此字段上的索引(如果有)。
顺便说一句,我经常使用这样的查询。
(我在结束范围内使用'2009-01-01'来避免一个一个错误。(Unix时间戳精确到秒和日期没有时间变成午夜。所以你原来的比较会从结果集中排除了12月31日。)
答案 1 :(得分:1)
您没有说出您的十位数entry_date是什么数据类型。
如果它是DATETIME
类型,那么你所做的就更难了。这是查询。
SELECT productid, productname
FROM products
WHERE entry_date >= str_to_date('01-01-2008', '%d-%m-%Y')
AND entry_date < str_to_date('01-11-2008', '%d-%m-%Y')
请注意BETWEEN
运算符不适合DATETIME
类型。如果未指定时间,系统将假定您指定的日期为午夜。因此,您需要在您选择的结束日期之后的第一天(在这种情况下,您选择的结束日期是2008年10月31日,因此您应该使用2008年11月1日)。然后,您需要使用<
而不是<=
作为范围的顶部,如图所示。
如果您不必使用UNIX_TIMESTAMP
数据类型,请不要。它们的灵活性不如普通DATETIME
类型。
如果您不介意以YYYY-MM-DD格式指定日期,那就更容易了:
SELECT productid, productname
FROM products
WHERE entry_date >= '2008-01-01'
AND entry_date < '2008-11-01'