私は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 件
テーブルスキーマを投稿していないので確実に知ることは困難ですが、
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')
関連した質問
- mySQLを使用して、現在のデータベーステーブルの情報で別のデータベーステーブルを更新するにはどうすればよいですか?
- ライブラリ管理システムのDB設計(さまざまなユーザーの認証と注文日の保持)
- SQLを使用して前の日付の列数を取得するにはどうすればよいですか?
- 履歴テーブルからアイテムをクエリする
- テーブルにクエリを実行してリンクテーブルを結合するときに、渡されたIDが結合テーブルにあるかどうかを確認し、結果にブール値として返すことはできますか?
- 親の「親」に重複がないことを確認してください
- 特定のサイズを作成する
- 複数の接続されたテーブルから時間を合計する方法は?
- mysqlでの2つの値の除算
- Oracleでフェデレーションストレージエンジン接続を確立するにはどうすればよいですか?
STR_TO_DATE
の2番目の引数 渡す日付文字列に一致する形式です。'%d/%m/%Y'
は月が2番目に来るはずであることを意味しますが、あなたの場合は15番目の月がないため、月が最初で、その後に日が続く必要があります。DATE_FORMAT(STR_TO_DATE("03/15/2018", '%m/%d/%Y'), '%Y-%m-%d')
それを修正する必要があります。