1

私はシンプルなPOSシステムに取り組んでおり、売上と経費のデータについてできるだけ多くの統計を生成しようとしていました。今週の売り上げを表示する方法が欲しかったのですが、APIを調べていくつかのチュートリアルを確認したところ、実際にそれを行う方法を見つけることができませんでした。DAY_OF_WEEK_IN_MONTH最後に、トランザクションが行われたトランザクションDAY_OF_WEEK_IN_MONTHを今日のトランザクションと比較することにしました。のように、それらが同じである場合、トランザクションは今日と同じ週、つまり今週に行われたに違いありません。最初はうまくいったように見えましたが、今は考え直しています。誰かが私にそれについて行く正しい方法を指摘してくれたら、私はそれを大いに感謝します。

public void getSalesTotalForWeek() throws SQLException {
    //getDatesCount() populates a collection(listDates) with dates in which
    //transactions took place
    getDatesCount();
    //sets cal with today's date
    Calendar cal = new GregorianCalendar();
    for (int i = 0; i < listDates.size(); i++) {
        //set c with the date of when the transaction took place
        Calendar c = new GregorianCalendar(Integer.parseInt(listDates.get(i).substring(0, 4)),
        Integer.parseInt(listDates.get(i).substring(5, 7)), Integer.parseInt(listDates.get(i).substring(8, 10)));
        //This is like saying if the day of week in month when the transaction took place
        //is the same as that of today, then the transaction
        //must have taken place in the same week as today
        if(cal.get(Calendar.DAY_OF_WEEK_IN_MONTH) == c.get(Calendar.DAY_OF_WEEK_IN_MONTH)){
            rst = stmt.executeQuery("SELECT * FROM transaction_history where Time like '"+   listDates.get(i) + "%'");
            while (rst.next()) {
                weekSalesTotal += rst.getInt(2);
            }
        }
    }
}
4

1 に答える 1

1

コードで修正することがいくつかあります。

public void getSalesTotalForWeek()

名前の付いたメソッドget*()は実際には何も返しません(直感に反します)。フィールドのようweekSalesTotalです。スレッドセーフについて覚えておいてください。


Calendar cal = new GregorianCalendar();

ある日、誰かが先週の売り上げを求めてきたらどうしますか?または3月の最初の週?開始日と終了日の両方を引数として渡すことを検討してください。また、サーバーのデフォルトのタイムゾーンを使用してもよろしいですか?


Calendar c = new GregorianCalendar(Integer.parseInt(listDates.get(i).substring(0, 4)),
Integer.parseInt(listDates.get(i).substring(5, 7)), Integer.parseInt(listDates.get(i).substring(8, 10)));

listDatesList<String>?代わりにタイプを検討してくださいDate。上記のコードは見栄えが悪いです。


cal.get(Calendar.DAY_OF_WEEK_IN_MONTH) == c.get(Calendar.DAY_OF_WEEK_IN_MONTH)

このコードはよくわかりません。のJavaDocを読んでDAY_OF_WEEK_IN_MONTHいますが、まだわかりません...


"SELECT * FROM transaction_history where Time like '"+   listDates.get(i) + "%'"

2番目の列だけに関心がある場合は、すべての列を選択しないでください(これを呼び出しましょうvalue)。また、SQLを連結しないでください。SQLインジェクションはすでに進行中です。最後likeに日付に演算子を使用しますか?データベースで適切なDATEタイプを使用していますか?


weekSalesTotalフィールドですか?同期について覚えておいてください。また、SQLをループで実行することは避けてください。

TL; DR

私はあなたの方法全体をもっと強力で、より速くそしてより単純なものに置き換えることができると信じています:

public int getSalesTotalWithin(Date start, Date end) {
  rst = stmt.executeQuery(
    "SELECT SUM(value) FROM transaction_history where Time BETWEEN ? AND ?");
  return rst.getInt(1);
}

これは単なる擬似コードであり、JDBCボイラープラッターと?置換が欠落しています。しかし、あなたはその考えを理解するでしょう。これで、任意の日付範囲で呼び出すことができます。例:

Calendar weekAgo = new GregorianCalendar();
weekAgo.add(Calendar.DATE, -7);
getSalesTotalWithin(weekAgo.getTime(), new Date());

先週の月曜日以降の統計が必要な場合:

Calendar lastMonday = new GregorianCalendar(TimeZone.getTimeZone("GMT"));
lastMonday.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
lastMonday.set(Calendar.HOUR_OF_DAY, 0);
//...zero other fields
getSalesTotalWithin(lastMonday.getTime(), new Date());
于 2012-11-10T18:39:53.717 に答える