Vervolg waar statement met datum

Ik gebruik Sequelize als mijn backend ORM. Nu wil ik wat WHEREbewerkingen uitvoeren op een Datum.

Meer specifiek wil ik alle gegevens ontvangen waarbij een datum tussen nu en 7 dagen geleden ligt.

Het probleem is dat de documentatie niet specificeert welke bewerkingen u kunt uitvoeren op Datatypes.DATE

Kan iemand me in de goede richting wijzen?


Antwoord 1, autoriteit 100%

Zoals Molda zegt, kun je $gt, $lt, $gteof $ltegebruiken met een datum:

model.findAll({
  where: {
    start_datetime: {
      $gte: moment().subtract(7, 'days').toDate()
    }
  }
})

Als je v5 van Sequelize gebruikt, moet je Opopnemen omdat de sleutel is verplaatst naar Symbol

const { Op } = require('sequelize')
model.findAll({
  where: {
    start_datetime: {
      [Op.gte]: moment().subtract(7, 'days').toDate()
    }
  }
})

Bekijk hier meer vervolgdocumentatie


Antwoord 2, autoriteit 66%

Ik moest de Operators-symbolen van sequelize importeren en zo gebruiken.

const { Op } = require('sequelize')
model.findAll({
  where: {
    start_datetime: {
      [Op.gte]: moment().subtract(7, 'days').toDate()
    }
  }
})

Volgens de documenten wordt dit om veiligheidsredenen als best practice beschouwd.

Zie http://docs.sequelizejs.com/manual/tutorial/querying.html voor meer info.

Het gebruik van Sequelize zonder aliassen verbetert de beveiliging. Sommige kaders
automatisch gebruikersinvoer in js-objecten ontleden en als u dit niet doet:
uw invoer zuiveren, is het misschien mogelijk om een ​​object te injecteren met
tekenreeksoperators om te Sequelize.

(…)

Voor een betere beveiliging wordt sterk aangeraden om Sequelize.Op te gebruiken en niet
helemaal afhankelijk zijn van een stringalias. U kunt uw alias beperken
applicatie zal nodig hebben door het instellen van operatorsAliases optie, vergeet niet om
ontsmet gebruikersinvoer, vooral wanneer u ze rechtstreeks doorgeeft aan
Sequelize-methoden.


Antwoord 3, autoriteit 15%

U kunt ook Sequelize.literal()gebruiken om datummanipulaties in SQL uit te voeren.

De volgende code werkt met Postgres, maar ik ben er vrij zeker van dat iets soortgelijks ook in andere systemen kan worden gedaan:

model.findAll({
  where: {
    start_datetime: {
      $gte: Sequelize.literal('NOW() - INTERVAL \'7d\''),
    }
  }
})

Antwoord 4, autoriteit 10%

Deze oplossing is zonderde moment.jsbibliotheek.

Tussen 7 dagen geleden en nu

const sevenDaysAgo = new Date(new Date().setDate(new Date().getDate() - 7));
models.instagram.findAll({
  where: {
    my_date: {
      $gt: sevenDaysAgo,
      $lt: new Date(),
    },
  },
});

Tussen nu en 7 dagen vanaf nu

const sevenDaysFromNow = new Date(new Date().setDate(new Date().getDate() + 7));
models.instagram.findAll({
  where: {
    my_date: {
      $gt: new Date(),
      $lt: sevenDaysFromNow,
    },
  },
});

Opmerkingen:

  • $gtstaat voor “groter dan”. Je zou $gtekunnen gebruiken in plaats van $gt. $gtestaat voor “groter dan of gelijk aan”. Hetzelfde geldt natuurlijk voor $lte.
  • Technisch gezien heb je zowel $ltals $gtnodig om ervoor te zorgen dat de datum niet in de toekomst ligt (volgens de oorspronkelijke vraag).
  • Andere antwoorden tonen het gebruik van [Sequelize.Op.gt]in plaats van $gt. Gebruik dat als op Sequelize v5.

Other episodes