为什么这个DATE_FORMAT用于转换此MySql查询中的数据格式不起作用?

时间:2018-05-25 14:39:52

标签: mysql sql database rdbms

我不是DB,我对此查询有以下问题:

SELECT 
    count(*)                                                AS exist

FROM Market_Commodity_Price_Series                          AS MCPS
INNER JOIN MarketDetails_CommodityDetails                   AS MD_CD
      ON MCPS.market_commodity_details_id = MD_CD.id

INNER JOIN MarketDetails                                    AS MD
      ON MD_CD.market_details_id = MD.id

INNER JOIN CommodityDetails                                 AS CD
      ON MD_CD.commodity_details_id = CD.id

INNER JOIN CommodityName                                    AS CN
      ON CD.id = CN.commodity_details_id

WHERE 
     MD.market_name = "Butare"

AND CN.commodity_name = "Soya"

AND CN.language_id = 3
AND
     MCPS.price_date >= DATE_FORMAT(STR_TO_DATE("03/15/2018", '%d/%m/%Y'), '%Y-%m-%d') 

AND 
     MCPS.price_date <= DATE_FORMAT(STR_TO_DATE("03/15/2018", '%d/%m/%Y'), '%Y-%m-%d')

问题是它总是返回0作为输出。

我知道问题与这些 WHERE 条件有关:

AND
     MCPS.price_date >= DATE_FORMAT(STR_TO_DATE("03/15/2018", '%d/%m/%Y'), '%Y-%m-%d') 

AND 
     MCPS.price_date <= DATE_FORMAT(STR_TO_DATE("03/15/2018", '%d/%m/%Y'), '%Y-%m-%d')

问题是 Market_Commodity_Price_Series 表的 price_date 字段包含值 15/03/2018 而不是 03 /二千零十八分之十五

此查询正在使用:

DATE_FORMAT(STR_TO_DATE("03/15/2018", '%d/%m/%Y'), '%Y-%m-%d')

从日期格式转换为另一种格式,但它似乎无效。

为什么呢?怎么了?我错过了什么?我该如何解决这个问题?

3 个答案:

答案 0 :(得分:3)

STR_TO_DATE的第二个参数是一种格式,它应与您传入的日期字符串相匹配。

'%d/%m/%Y'意味着月份应该排在第二位,但由于您的案例中没有第15个月,因此月份必须是第一个月,然后是当天。

DATE_FORMAT(STR_TO_DATE("03/15/2018", '%m/%d/%Y'), '%Y-%m-%d')应该修复它。

答案 1 :(得分:1)

由于您尚未发布表架构,因此很难确定,但似乎您将price_date存储为字符串,然后尝试将其与日期进行比较。以这种方式比较字符串可以工作但不总是按照您的预期方式工作。最好将两个日期转换为实际date格式或使用unix时间戳:

STR_TO_DATE(MCPS.price_date,'%d/%m/%Y') >= STR_TO_DATE('03/15/2018','%m/%d/%Y')

UNIX_TIMESTAMP(STR_TO_DATE(MCPS.price_date,'%d/%m/%Y')) >= UNIX_TIMESTAMP(STR_TO_DATE('03/15/2018','%m/%d/%Y'))

这两个都应该有用,但问题仍然是你会以这种方式获得相对较差的表现而忘记使用任何类型的索引。

更好的方法是以date格式存储您的日期,并考虑使用索引以提高性能。

答案 2 :(得分:-1)

实现您要做的事情的最简单方法是在列本身上使用date_format。我希望列的值是DateTime格式。

所以只做

DATE_FORMAT(MCPS.price_date,'%c-%d-%Y') >= STR_TO_DATE("03/15/2018", '%c-%d-%Y')      
   AND 
DATE_FORMAT(MCPS.price_date,'%c-%d-%Y') <=(STR_TO_DATE("03/15/2018", '%c-%d-%Y')