web-dev-qa-db-fra.com

PostgreSQL Obtenez un datetime / timestamp aléatoire entre deux datetime / timestamp

Le titre est assez explicite, ma question est de savoir si j'obtiens deux dates avec l'heure:

  • 01-10-2014 10:00:00
  • 01-20-2014 20:00:00

Est-il possible de choisir un datetime aléatoire entre ces deux datetime?

J'ai essayé avec la fonction random () mais je ne sais pas vraiment comment l'utiliser avec datetime

Merci

Matthiew

31
Matthiew

Vous pouvez presque tout faire avec les opérateurs date/heure :

select timestamp '2014-01-10 20:00:00' +
       random() * (timestamp '2014-01-20 20:00:00' -
                   timestamp '2014-01-10 10:00:00')
55
pozs

J'ai adapté la réponse de @pozs, car je n'avais pas d'horodatage à utiliser.

90 days est la fenêtre horaire souhaitée et le 30 days est la distance jusqu'à laquelle pousser la fenêtre de temps. Cela est utile lorsque vous l'exécutez via un travail plutôt qu'à une heure définie.

select NOW() + (random() * (NOW()+'90 days' - NOW())) + '30 days';
9
Dustin

Vous pouvez créer l'horodatage à partir d'un entier aléatoire (tampon Unix), par exemple:

select timestamp 'Epoch' + (
          extract('Epoch' from timestamp '2014-10-01 10:00:00')
        + random() * (
                     extract('Epoch' from timestamp '2014-20-01 20:00:00')
                   - extract('Epoch' from timestamp '2014-10-01 10:00:00')
       )) * interval '1 second'

Enveloppez-le dans une fonction SQL si vous l'utilisez souvent, car il n'est pas très lisible même après avoir tenté de le formater quelque peu.

Une autre façon de le faire serait d'utiliser generate_series() de la date de début à la date de fin, ordonnée par random (), mais cela ralentirait les choses avec des intervalles de date plus longs, donc vous serez mieux avec l'approche ci-dessus.

3