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
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);
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');
select *
from employee
where
to_char(date_of_birth, 'MMDD') between
to_char(current_date, 'MMDD') and to_char(current_date + 20, 'MMDD')
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.