Pobranie uzytkownikow z odpowiednim wiekiem.

0

Witam,

Mam tabele users oraz tabele user_data. W drugiej tabeli jest zapisany wiek uzytkownika. Jednakze wiek data zostala rozbita na 3 rekordy tj rok, miesiac i dzien.

Moje pytanie to jak napisac zapytanie SQL, z warunkiem tj age < 30.

Samo zapytanie bedzie uzywazne przez ludzi z marketingu. Goscie maja sobie system w ktorym klikaja przycisk i ten wywala im liste adresow email do ktorych wysylaja emaile.

0

Złącz kolumny w jeden ciag znakow i skonwertuj na date
Convert(date,Rok + '-' miesiac +'-'+ dzien, 120) w ms i dalej diffdate

0

Juz cos takiego podobnego zrobilem:

AGE(cast(concat(CAST(COALESCE(NULLIF(REGEXP_REPLACE(aud_year.data_value, '[[:alpha:]]', '1900', 'g'), ''), '1900') AS INTEGER), '-01-01') AS date))
0

W tej kolumnie z rokiem jest duzo sufu. Rok moze byc null, moze byc 0, zauwazylem tez ze czasem jest f etc etc

1

Zrób sobie funkcję is_date taką:

CREATE OR REPLACE FUNCTION is_date(character varying)  RETURNS date AS
$BODY$
BEGIN
  return $1::DATE;
exception when datetime_field_overflow OR invalid_datetime_format then
  return null;
END 
$BODY$
LANGUAGE plpgsql COST 1;

a potem, to już prosto:


with dane(rok, mc, d) as(values
('1981', '12', '13'),
('1999', '02', '30'),
('1983', null, null),
(null, '01', '05'),
(null, null, null),
('1977','07','08')
)
select * from dane where age(is_date(rok||mc||d))>interval '30 year'
0

@Marcin.Miga: Funkcja wyglada na taka, ktorej potrzebuje. Jednak jak podam np 19790101 czy 19980101 to zwraca mi null. Ta funkcja dziala tylko w niewiely przykladach. Dla wiekszosci dat zrwaca null, pomimo, ze data jest ok. Nie wiem czy to moze zalezy od wersji postgres?

0

Daj wynik SHOW datestyle

0

@Marcin.Miga:
DateStyle:

ISO, MDY
0

Czy to moze byc dlatego, ze w bazie danych przechowuje wartosci dnia i miesiaca tj 7, 1, a nie 07, 01? Bez wodzacego zera na poczatku?

2

@poniatowski: Tak. Jeśli masz loiczby bez zer, to dodaj kreski: (nie zmieniaj funkcji)

with dane(rok, mc, d) as(values
('1981', '12', '13'),
('1999', '02', '30'),
('1983', null, null),
(null, '01', '05'),
(null, null, null),
('1977','07','08'),
('1954','7','9'),
('1984','1','20')
)
select * from dane where age(is_date(rok||'-'||mc||'-'||d))>interval '30 year'
0

@Marcin.Miga: Dzieki!

0

@Marcin.Miga: Pracujesz jako bazo danowiec? Czy jestes wykladowca? :) Niezla wiedza i szybka odpowiedz.

1

Bazodanowiec. Wykładowcą ze względów formalnych nie mogę być :D

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.