web-dev-qa-db-fra.com

knex: sélectionnez les lignes qui sont dans une certaine plage de dates

Comment puis-je sélectionner des lignes du tableau qui sont dans une certaine plage de dates avec des requêtes knex? Par exemple, sélectionner des lignes des sept derniers jours.

Version Knex: 0.15.0

DB: PostgreSQL

9
Ziyaddin Sadigov

N'importe quelle façon que vous choisissez de les interroger devrait le faire, voici une façon de le faire:

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

Vous pouvez aussi utiliser :

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

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

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

3
kaiak

Vous pouvez simplement créer deux horodatages différents à l'aide de l'objet Javascript Date() et les convertir en chaînes.

    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

Si vous utilisez moment, il sera assez facile de réaliser ce que vous voulez. créez une date au format ISO 8601 à partir de la chaîne de date dont vous disposez.

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');

La méthode toISOString() formatera la date au format YYYY-MM-DD[T]HH:mm:ss.SSS[Z], qui peut être utilisé avec knex pour trouver l'enregistrement dans la plage de temps. Cependant, je préfère la méthode format() à toISOString() parce que la méthode format utilise le format par défaut (YYYY-MM-DDTHH: mm: ssZ) sans millisecondes et maintient le fuseau horaire décalage.

Maintenant, vous pouvez trouver les enregistrements pertinents dans la plage donnée de startDate et endDate comme indiqué ci-dessous,

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

ou bien vous pouvez utiliser whereBetween() de knex comme,

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

Remarque: le nom de la colonne createdAt est remplacé par created_at Dans les versions les plus récentes de knex. Au moment d'écrire cette réponse, j'ai utilisé [email protected]. Mais vous pouvez toujours utiliser createdAt avec les anciennes versions de knex.

0
Kiran Maniya

Dans votre Repo, mettez simplement ces clause where:

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

Le code ci-dessus est utile pour obtenir tous les enregistrements du 01-01-2009 jusqu'à la date en cours (vous pouvez remplacer la nouvelle date () par votre propre date jusqu'à laquelle vous souhaitez les enregistrements).

Ques: Comment obtenir le 2009-01-01T00: 00: 00Z à partir du 14/04/2020 (MM/DD/YYYY)?

Réponse:

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

Remarque: N'oubliez pas d'envoyer la date en MM/DD/YYYY. Il résout également le problème de la date ou de l'heure affichée comme incrémentée ou décrémentée.

0
Ashutosh Tiwari