Ich möchte alle Datensätze abrufen, die vor einem Monat erstellt wurden, genau zur selben Stunde. (Alter der Aufzeichnungen sollte nur n Monate, 0 Tage, 0 Stunden)Abrufen von Datensätzen mit monatlichem Erstellungsdatum
n = {1, 2, ...}
zum Beispiel, wenn now()
2016-11-15 13:15:00
ist, jeder Datensatz mit create_date, wie unten zu erwarten zurück.
2010-11-15 13:15:00 -- different year
2016-02-15 13:15:00 -- different month
2016-11-15 13:46:23 -- different minute/seconds
2010-11-15 13:46:23 -- different year, month, minute and sec
Die beste einfache Abfrage, die ich denken konnte, war:
SELECT *
FROM mytable
WHERE extract(day from age(now(), created_date)) = 0 -- same day any month ago
AND extract(hour from age(now(), created_date)) = 0; -- same hour
Aber das Problem gibt es einige bestimmte Tage sind, die aus der Abfrage wird gelassen werden. Wie wenn in diesem Fall ist das Alter des Datensatzes 28 days
statt 1 Monat
created_date=2016-01-31 13:00:00
now() is 2016-02-28 13:00:00
; nach der age
Funktion in Postgresql. So wird es nie Ende Februar oder 1. März geholt werden.
Jede Idee, wie dieses Problem am einfachsten behandelt werden kann, ist willkommen.
Hier einige Testdaten, die Sie überprüfen können:
create table mytable (created_date timestamp, expected_records int);
truncate mytable;
insert into mytable (created_date, expected_records) values
('2013-01-11 13:22:33', 2),
('2014-02-11 13:58:22', 2),
('2015-03-21 13:22:00', 1),
('2013-02-28 13:11:00', 5),
('2017-02-28 13:22:00', 5),
('2016-03-31 13:22:00', 5),
('2015-04-30 13:22:00', 5),
('2014-05-31 13:22:00', 5),
('2014-05-31 12:22:00', 1);
die letzte SELECT-Abfrage kann auf jeder dieser timstamps ausgeführt werden sollte aber kehrt gleiche Menge an Zeilen wie expected_records
Staaten. Sie können auch 'some date'::timestamp
anstelle von jetzt() verwenden, um Zeit zu fälschen.
Um zu bestätigen, zählen Sie Kalendermonate, nicht Sätze von 30 Tagen usw.? – toonice
korrekt. @toonice Ich zähle nicht 30 Tage, ich möchte N Monate Aufzeichnungen. – Rahman
Soll '2010-11-15 13:46:23' (anderes Jahr und Minuten/Sekunden) aufgeführt werden? – toonice