我不是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')
从日期格式转换为另一种格式,但它似乎无效。
为什么呢?怎么了?我错过了什么?我该如何解决这个问题?
答案 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')