Ik gebruik Sequelize als mijn backend ORM. Nu wil ik wat WHERE
bewerkingen 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
, $gte
of $lte
gebruiken met een datum:
model.findAll({
where: {
start_datetime: {
$gte: moment().subtract(7, 'days').toDate()
}
}
})
Als je v5 van Sequelize gebruikt, moet je Op
opnemen 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.js
bibliotheek.
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:
$gt
staat voor “groter dan”. Je zou$gte
kunnen gebruiken in plaats van$gt
.$gte
staat voor “groter dan of gelijk aan”. Hetzelfde geldt natuurlijk voor$lte
.- Technisch gezien heb je zowel
$lt
als$gt
nodig 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.