为什么这个用于转换mysql查询中的数据格式的日期格式不起作用?

goqiplq2  于 2021-06-23  发布在  Mysql
关注(0)|答案(3)|浏览(282)

我不太喜欢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作为输出。
我了解到问题与以下条件有关:

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')

问题是my market\u commodity\u price\u series表的price\u date字段包含值15/03/2018,而不是03/15/2018。
此查询正在使用:

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

从一种日期格式转换成另一种格式,但似乎不起作用。
为什么?怎么了?我错过了什么?如何解决此问题?

wtzytmuj

wtzytmuj1#

最简单的方法就是在列本身上使用date\u格式。我希望列的值是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')
3bygqnnd

3bygqnnd2#

很难确定,因为您还没有发布表架构,但似乎您正在存储 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 格式,并考虑使用索引以提高性能。

ddrv8njm

ddrv8njm3#

第二个论点 STR_TO_DATE 应与传入的日期字符串匹配的格式。 '%d/%m/%Y' 意味着这个月应该是第二个月,但是因为在你的例子中没有第15个月,所以这个月必须是第一个月,然后是第二天。 DATE_FORMAT(STR_TO_DATE("03/15/2018", '%m/%d/%Y'), '%Y-%m-%d') 你应该把它修好。

相关问题