bugfix> mysql > 投稿

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

問題はprice_date 私のフィールドMarket_Commodity_Price_Series テーブルには値が含まれています15/03/2018 ではなく2018年3月15日

このクエリは次を使用しています:

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

日付形式を別の形式に変換しますが、機能していないようです。

どうして?なにが問題ですか?私は何が欠けていますか?この問題を修正するにはどうすればよいですか?

回答 3 件
  • STR_TO_DATE の2番目の引数  渡す日付文字列に一致する形式です。

    '%d/%m/%Y'  は月が2番目に来るはずであることを意味しますが、あなたの場合は15番目の月がないため、月が最初で、その後に日が続く必要があります。

    DATE_FORMAT(STR_TO_DATE("03/15/2018", '%m/%d/%Y'), '%Y-%m-%d')  それを修正する必要があります。

  • テーブルスキーマを投稿していないので確実に知ることは困難ですが、 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 に保存することです  はじめに、パフォーマンスのためにインデックスの使用を検討してください。

  • あなたがしようとしていることを達成する最も簡単な方法は、列自体に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')
    
    

あなたの答え