web-dev-qa-db-fra.com

Comment obtenir seulement la partie date/mois d'une date dans postgresQL

Hello All J'ai une table dans ma base de données d'administration pg. Il y a une table employee dans cette table.Avec le champ: - 1) name 2) date_of_birth

Maintenant, le scénario est celui où je veux connaître le jour de naissance pour la date actuelle et les 20 jours à venir.

1)from_date=28-Jan-2013
2)to_date=16-feb-2013

Je veux sélectionner tous les enregistrements de la table pour lesquels le date de naissance 

lies between 28-Jan and 16-feb
20
Suri

Essaye ça:

SELECT *
FROM   bdaytable
WHERE  bdate >= '2013-01-28'::DATE
AND    bdate <= '2013-02-16'::DATE;

Vous pouvez également essayer overlaps :

SELECT *
FROM bdaytable
WHERE (bdate, bdate) 
OVERLAPS ('2013-01-28'::DATE, '2013-02-16'::DATE);

avec extract, month, day :

SELECT *
FROM   bdaytable
WHERE  Extract(month from bdate) >= Extract(month from '2013-01-28'::DATE)
AND    Extract(month from bdate) <= Extract(month from '2013-02-16'::DATE)
AND    Extract(day from bdate) >= Extract(day from '2013-01-28'::DATE)
AND    Extract(day from bdate) <= Extract(day from '2013-02-16'::DATE);

Incorporer Now() et interval pour rendre la requête dynamique avec la date du jour:

SELECT *
FROM   bdaytable
WHERE  Extract(month from bdate) >= Extract(month from Now())
AND    Extract(month from bdate) <= Extract(month from Now() + Interval '20 day')
AND    Extract(day from bdate) >= Extract(day from Now())
AND    Extract(day from bdate) <= Extract(day from Now() + Interval '20 day');
39
bonCodigo
select *
from employee
where 
    to_char(date_of_birth, 'MMDD') between 
    to_char(current_date, 'MMDD') and to_char(current_date + 20, 'MMDD')
3
Clodoaldo Neto

Je pense que cela devrait fonctionner. Utilisez interval.

SELECT * 
FROM Employee
WHERE Date_Of_Birth >= now() AND Date_Of_Birth <= now() + interval '20 day'

Si vous voulez avoir une date de naissance entre ces jours (et l'année importe peu), alors ce serait légèrement différent.

MODIFIER

Si l'année n'a pas d'importance, alors que je suis sûr qu'il existe une meilleure façon, cela pourrait fonctionner. En gros, il s'agit simplement de convertir toutes les années en une année commune (dans ce cas, 2000). Vous pouvez également faire de même avec votre paramètre d'entrée.

(Date_Of_Birth + (2000-EXTRACT(YEAR FROM Date_Of_Birth) || ' years')::interval)

Curieux de savoir ce que d’autres ont utilisé dans le passé car ce n’est probablement pas le plus efficace.

Bonne chance.

0
sgeddes