我不太喜欢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')
从一种日期格式转换成另一种格式,但似乎不起作用。
为什么?怎么了?我错过了什么?如何解决此问题?
3条答案
按热度按时间wtzytmuj1#
最简单的方法就是在列本身上使用date\u格式。我希望列的值是datetime格式。
所以就这么做吧
3bygqnnd2#
很难确定,因为您还没有发布表架构,但似乎您正在存储
price_date
然后尝试将其与日期进行比较。用这种方法比较字符串是可行的,但并不总是你所期望的那样。最好将两个日期都转换为实际日期date
格式化或使用unix时间戳:或
这两种方法都应该有效,但问题仍然是,这样做的性能会相对较差,而且会忘记使用任何类型的索引。
一个更好的方法是把你的约会对象储存在
date
格式,并考虑使用索引以提高性能。ddrv8njm3#
第二个论点
STR_TO_DATE
应与传入的日期字符串匹配的格式。'%d/%m/%Y'
意味着这个月应该是第二个月,但是因为在你的例子中没有第15个月,所以这个月必须是第一个月,然后是第二天。DATE_FORMAT(STR_TO_DATE("03/15/2018", '%m/%d/%Y'), '%Y-%m-%d')
你应该把它修好。