web-dev-qa-db-ja.com

knex:特定の日付範囲にある行を選択します

Knexクエリで特定の日付範囲にある行をテーブルから選択するにはどうすればよいですか?たとえば、過去7日間の行を選択します。

Knexバージョン:0.15.0

DB:PostgreSQL

9

クエリを実行するために選択した方法で行う必要のある方法を以下に示します。

knex('table')
  .where('createdAt', '>=', '2009-01-01T00:00:00Z')
  .where('createdAt', '<', '2010-01-01T00:00:00Z')
15
Mikael Lepistö

あなたも使うことができます:

  const from = '2019-01-01';
  const to = '2019-02-02';

  knex('myTable')
    .select()
    .whereBetween('createdAt', [from, to]);

http://knexjs.org/#Builder-whereBetween

3
kaiak

JavaScript Date()オブジェクトを使用して2つの異なるタイムスタンプを作成し、それらを文字列に変換するだけです。

    const currentDate = new Date()

    // Must convert to strings in case you need to prefix a '0' for single digit months or dates
    const currentYear = "" + currentDate.getUTCFullYear()
    const currentMonth = "" + (currentDate.getUTCMonth() + 1) //month indexed at 0
    const currentDay = "" + currentDate.getUTCDate()
    const currentHour = "" + currentDate.getUTCHours()
    const currentMinute = "" + currentDate.getUTCMinutes()
    const currentSeconds = "" + currentDate.getUTCSeconds()

    //Timestamp format: YYYY-MM-DDTHH:MM:SSZ
    const yesterdayTimestamp = `${currentYear}-` +
      // Ternaries are for prefixing a 0 to return values that are single digit
      `${currentMonth.length === 2 ? currentMonth : '0' + currentMonth}-` +
      `${currentDay.length === 2 ? currentDay : '0' + currentDay}T` +
      `${currentHour.length === 2 ? currentHour : '0' + currentHour}:` +
      `${currentMinute.length === 2 ? currentMinute : '0' + currentMinute}:` +
      `${currentSeconds.length === 2 ? currentSeconds : '0' + currentSeconds}Z`

    const lastWeek = new Date()
    lastWeek.setUTCDate(currentDate.getUTCDate() - 1)
    // Then do same string manipulations to create timestamp string for one week ago...
1
Morgan Huegel

momentを使用している場合は、簡単に目的を達成できます。お持ちの日付文字列から_ISO 8601_形式の日付を作成します。

_let startDate = '2019-01-01';
startDate = moment(startDate).format('YYYY-MM-DDTHH:mm:ssZ');
let endtDate = '2019-10-01';
endDate = moment(endDate).format('YYYY-MM-DDTHH:mm:ssZ');
_

toISOString()メソッドは、日付を_YYYY-MM-DD[T]HH:mm:ss.SSS[Z]_形式でフォーマットします。これをknexと共に使用して、時間範囲内のレコードを検索できます。ただし、formatメソッドはミリ秒なしのデフォルト形式(YYYY-MM-DDTHH:mm:ssZ)を使用し、タイムゾーンを維持するため、format()よりもtoISOString()メソッドを使用しますオフセット。

これで、以下のようにstartDateendDateの指定された範囲で関連レコードを見つけることができます。

_knex('records')
  .where('created_at', '>=', startDate.toString())
  .where('created_at', '<', endDate.toString())
  .then((rows) => {
     /*
      * perform operations on record
      */
  })
  .catch((e) => {
       console.log(e);
  });
_

または、knexのwhereBetween()を次のように使用できます。

_knex('records')
  .whereBetween('created_at', [startDate.toString() , endDate.toString()])
  .then((rows) => {
     /*
      * perform operations on record
      */
  })
  .catch((e) => {
       console.log(e);
  });
_

注:createdAtの最新バージョンでは、knex列名は_created_at_に置き換えられています。この回答を書いているとき、私は_[email protected]_を使用しました。ただし、古いバージョンのknexではcreatedAtを使用できます。

0
Kiran Maniya

あなたのリポジトリには、これらのwhere句を入れてください:

  MODEL.query()
          .where('created_at', '>=', '2009-01-01T00:00:00Z')
          .where('created_at', '<', new Date())
          .orderBy('created_at','desc|asc')

上記のコードは、2009-01-01から現在の日付までのすべてのレコードを取得するのに役立ちます(new Date()を、レコードが必要になるまでの独自の日付に置き換えることができます)。

クエリ:2020年4月14日(MM/DD/YYYY)から2009-01-01T00:00:00Zを取得するにはどうすればよいですか?

答え:

dateSplit = date.split("/");
            date = `${dateSplit[2]}-${dateSplit[0]}-${dateSplit[1]}`;
            date = date + "T00:00:00.000Z";

注:MM/DD/YYYYで日付を送信することを忘れないでください。また、日付または時刻が増分または減分として表示される問題も解決します。

0
Ashutosh Tiwari