wake-up-neo.net

So erhalten Sie nur Datum/Monat von einem Datum in PostgresQL

Hallo alle Ich habe eine Tabelle in meiner pg-Admin-Datenbank. In dieser Tabelle befindet sich eine employee -Tabelle. Mit dem Feld: - 1) name 2) date_of_birth

Nun ist das Szenario so, dass ich den Geburtstag für das aktuelle Datum und die kommenden 20 Tage wissen möchte Wenn das aktuelle Datum beispielsweise der 28. Januar 2013 ist

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

Ich möchte alle Datensätze aus der Tabelle auswählen, für die die Geburtsdatum  

lies between 28-Jan and 16-feb
20
Suri

Versuche dies:

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

Sie können auch versuchen, overlaps :

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

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

Mit Now() und interval können Sie die Abfrage mit dem aktuellen Datum dynamisieren:

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

Ich denke das sollte funktionieren. Verwenden Sie interval.

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

Wenn Sie zwischen diesen Tagen ein Geburtsdatum erhalten möchten (und das Jahr keine Rolle spielt), wäre das etwas anders.

BEARBEITEN

Wenn das Jahr keine Rolle spielt, bin ich sicher, dass es einen besseren Weg gibt, aber das könnte funktionieren. Im Grunde werden nur alle Jahre in ein gewöhnliches Jahr (in diesem Fall 2000) konvertiert - Sie könnten dasselbe mit Ihren Eingabeparametern tun.

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

Neugierig, was andere in der Vergangenheit verwendet haben, da dies wahrscheinlich nicht das effizienteste ist.

Viel Glück.

0
sgeddes