如何在MySQL中将10位unix日期与dd / mm / yyyy日期格式进行比较?

时间:2011-11-22 03:10:01

标签: mysql sql

我想在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'

我做错了什么?

2 个答案:

答案 0 :(得分:1)

两个提示:

  1. 利用MySQL的原生日期格式。
  2. 将计算放在比较的常数部分。
  3. 将这些放在一起,您的查询应如下所示:

    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'