powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / функция age(timestamp, timestamp) считает не правильно
14 сообщений из 14, страница 1 из 1
функция age(timestamp, timestamp) считает не правильно
    #32716128
ZemA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет всем!
смотрите что творится
Код: plaintext
1.
2.
3.
4.
zstaff=# select age('01.03.04', '01.02.04');
   age
 --------- 
  28  days
( 1  row)
хотя
Код: plaintext
1.
2.
3.
4.
zstaff=# select age('01.02.04', '01.01.04');
  age
 ------- 
  1  mon
( 1  row)
...
Рейтинг: 0 / 0
функция age(timestamp, timestamp) считает не правильно
    #32716896
wbear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а че в Тюмени разве 2001г был высокосным? :)

#select age('2004-03-01', '2004-02-01');
age
---------
29 days
(1 row)

#select age('2001-03-01', '2001-02-01');
age
---------
28 days
(1 row)

#select age('01.03.04', '01.02.04');
---------
1 days
(1 row)


дело в формате ,уменя (MM.DD.YY) ,а у тебя (YY.MM.DD)
гляди в сторону LC_TIME
...
Рейтинг: 0 / 0
функция age(timestamp, timestamp) считает не правильно
    #32717008
ZemA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wbearа че в Тюмени разве 2001г был высокосным? :)
нет с этим все нормально просто '01.03.04' это '01.03.2004'.

тем не менее
wbear
#select age('2004-03-01', '2004-02-01');
age
---------
29 days
(1 row)

почему 29 days должно быть 1 mons.

написал функцию на plpgsql, рабатает в 10 раз медленней чем age :(
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
CREATE OR REPLACE FUNCTION public.interval_between(date, date)
  RETURNS interval AS
'
declare
  from_date alias for $1;
  to_date   alias for $2;
  fday   integer := 0;
  fmonth integer := 0;
  fyear  integer := 0;
  tday   integer := 0;
  tmonth integer := 0;
  tyear  integer := 0;
  xyears integer := 0;
  xmons  integer := 0;
  xdays  integer := 0;
begin
  if from_date >= to_date then
    return 0;
  end if;

  fday   := date_part(\'day\', from_date);
  fmonth := date_part(\'month\', from_date);
  fyear  := date_part(\'year\', from_date);


  tday   := date_part(\'day\', to_date);
  tmonth := date_part(\'month\', to_date);
  tyear  := date_part(\'year\', to_date);

  if fday < tday then
    xdays := tday-fday;
  end if;

  if fday > tday then
    xmons := xmons-1;
    xdays := days_in_month(fyear, fmonth)-fday+tday;
  end if;

  if fmonth < tmonth then
    xmons := xmons + tmonth - fmonth;
  end if;

  if fmonth > tmonth then
    xmons := xmons + 12-fmonth+tmonth;
  end if;

  if fyear < tyear then
    xyears := tyear-fyear;
  end if;

  return ( (xyears || \' year\')::interval + (xmons || \' month\')::interval + (xdays || \' day\')::interval );
end;
'
  LANGUAGE 'plpgsql' VOLATILE;
...
Рейтинг: 0 / 0
функция age(timestamp, timestamp) считает не правильно
    #32717569
Код: plaintext
1.
2.
3.
select age('03.01.04'::date, '02.01.04'::date)::text AS "value", 'age' AS "name"
UNION ALL SELECT date_part('month','02.01.04'::date)::text, 'month'
UNION ALL SELECT date_part('day','02.01.04'::date)::text, 'day'
UNION ALL SELECT date_part('year','02.01.04'::date)::text, 'year';
...
Рейтинг: 0 / 0
функция age(timestamp, timestamp) считает не правильно
    #32717739
ZemA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну и что?
Код: plaintext
1.
2.
3.
4.
5.
6.
 value | name
 -------+------- 
  1  day | age
  1      | month
  2      | day
  2004   | year
( 4  rows)
...
Рейтинг: 0 / 0
функция age(timestamp, timestamp) считает не правильно
    #32717745
Shweik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По поводу первого поста.
tst=# select age('01.03.04', '01.02.04');
age
-------
1 mon
(1 row)
В чем проблема-то?
Может нужно посмотреть что напишет select version(); ???
У меня он пишет вот так:
tst=# select version();
version
-------------------------------------------------------------------
PostgreSQL 7.4 on i386-unknown-freebsd4.4, compiled by GCC 2.95.3
Видимо в твоем релизе действительно баг-с.
...
Рейтинг: 0 / 0
функция age(timestamp, timestamp) считает не правильно
    #32718041
ZemA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShweikПо поводу первого поста.
tst=# select age('01.03.04', '01.02.04');
age
-------
1 mon
(1 row)
В чем проблема-то?
Может нужно посмотреть что напишет select version(); ???
У меня он пишет вот так:
tst=# select version();
version
-------------------------------------------------------------------
PostgreSQL 7.4 on i386-unknown-freebsd4.4, compiled by GCC 2.95.3
Видимо в твоем релизе действительно баг-с.
вот
Код: plaintext
1.
2.
3.
4.
staff=# select version();
                              version
 ------------------------------------------------------------------- 
 PostgreSQL  7 . 4  on i386-unknown-freebsd4. 8 , compiled by GCC  2 . 95 . 4 
( 1  row)

Проблемма в том что
Код: plaintext
1.
2.
3.
4.
staff=# select age('01.03.04', '01.02.04');
   age
 --------- 
  28  days
( 1  row)
Код: plaintext
1.
2.
3.
4.
staff=# select age('01.04.2004', '01.02.2004');
          age
 ------------------------ 
  1  mon  30  days  23 : 00 : 00 
( 1  row)
Код: plaintext
1.
2.
3.
4.
staff=# select age('01.05.2004', '01.02.2004');
           age
 ------------------------- 
  2  mons  29  days  23 : 00 : 00 
( 1  row)
Код: plaintext
1.
2.
3.
4.
staff=# select age('01.06.2004', '01.02.2004');
           age
 ------------------------- 
  3  mons  30  days  23 : 00 : 00 
( 1  row)
Код: plaintext
1.
2.
3.
4.
staff=# select age('01.06.2004', '01.03.2004');
          age
 ----------------------- 
  3  mons  1  day  23 : 00 : 00 
( 1  row)
...
Рейтинг: 0 / 0
функция age(timestamp, timestamp) считает не правильно
    #32718130
wbear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну 23:00:00 это видимо из за перехода на летнее время.
а вот с днями хз. проще в исходники залезть и поглядеть при надобности поправить.
...
Рейтинг: 0 / 0
функция age(timestamp, timestamp) считает не правильно
    #32718314
ZemA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В функции которую я написал есть ошибка.
вместо
Код: plaintext
1.
2.
  if fyear < tyear then
    xyears := tyear-fyear;
  end if;
нужно писать
Код: plaintext
1.
2.
3.
4.
5.
6.
  if fyear < tyear
  then
    xyears := tyear-fyear;
    if fmonth > tmonth then
      xyears := xyears- 1 ;   
    end if;
  end if;
...
Рейтинг: 0 / 0
функция age(timestamp, timestamp) считает не правильно
    #32718377
лениіец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А мож не стоит писать такое на plpgsql - сразу давай CPP functions!
...
Рейтинг: 0 / 0
функция age(timestamp, timestamp) считает не правильно
    #32719379
ZemA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Люди у кого стоит 8-ой postgres, проверьте пожалуйста age на вшивость.
...
Рейтинг: 0 / 0
функция age(timestamp, timestamp) считает не правильно
    #32719830
мдя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
удиффительное рядом.
Когда предлагал запустить - у меня возвращался месяц (?) , вроде бы точно помню.
Сейчас запускаю, получаю совсем даже наоборот. В чем сермяга??

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
Select  version()::text   AS  value, 'version'::text As  "name"
UNION ALL SELECT Null, Null

UNION ALL
select age('01.03.04', '01.02.04'::date)::text, 'age(''01.03.04'', ''01.02.04'')'
UNION ALL SELECT date_part('month','01.02.04'::date)::text, 'month 01.02.04'
UNION ALL SELECT date_part('day','01.02.04'::date)::text, 'day 01.02.04'
UNION ALL SELECT date_part('year','01.02.04'::date)::text, 'year 01.02.04'
UNION ALL SELECT Null, Null

UNION ALL
select age('03.01.04', '02.01.04')::text, 'age(''03.01.04'', ''02.01.04'')'
UNION ALL
select age('03.01.2004'::date, '02.01.2004'::date)::text, 
	'age(''03.01.04''::date, ''02.01.04''::date)'
UNION ALL
select age('03.01.2004'::timestamp, '02.01.2004'::date)::text,
	 'age(''03.01.04''::timestamp, ''02.01.04''::date)'
UNION ALL
select age('03.01.2004'::date, '02.01.2004'::timestamp)::text,
	 'age(''03.01.04''::date, ''02.01.04''::timestamp)'
UNION ALL
select age('03.01.2004'::timestamp, '02.01.2004'::timestamp)::text,
	 'age(''03.01.04''::timestamp, ''02.01.04''::timestamp)'
UNION ALL SELECT Null, Null

UNION ALL SELECT age(('03.01.04'::date)+ 1 , '02.01.04'::date)::text , ' 03.01.04::date+1' 
UNION ALL SELECT age(('03.01.04 3:00'), '02.01.04'::date)::text , ' 03.01.04 3:00' 
UNION ALL SELECT age(('03.01.04 2:59:59'), '02.01.04'::date)::text, '03.01.04 2:59:59';

_____________________________  

value				name
PostgreSQL  7 . 3 . 4  on i386-unknown-freebsd5. 1 , compiled by GCC gcc (GCC)  3 . 2 . 2  [FreeBSD]
  20030205  (release)		version
	
 1  day				age('01.03.04', '01.02.04')
 1 				month  01 . 02 . 04 
 2 				day  01 . 02 . 04 
 2004 				year  01 . 02 . 04 
	
 29  days				age('03.01.04', '02.01.04')
 29  days				age('03.01.04'::date, '02.01.04'::date)
 1  mon				age('03.01.04'::timestamp, '02.01.04'::date)
 1  mon				age('03.01.04'::date, '02.01.04'::timestamp)
 1  mon				age('03.01.04'::timestamp, '02.01.04'::timestamp)
	
 1  mon  1  day			  03 . 01 . 04 ::date+ 1 
 1  mon  03 : 00 			  03 . 01 . 04   3 : 00 
 29  days  02 : 59 : 59 		 03 . 01 . 04   2 : 59 : 59 

т.е. проблема в реализации age(date,date)?? (а почему я ее сначала не заметил ???? Или что-то изменилось???)

Но резюме - кастуй в timestamp
...
Рейтинг: 0 / 0
функция age(timestamp, timestamp) считает не правильно
    #32719856
нашел
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ага, нашел:
select age(('03.01.04 00:00:00')::timestamptz, ('02.01.04 00:00:00')::timestamptz)::text
UNION ALL
select age(('03.01.04 00:00:00')::timestamp , ('02.01.04 00:00:00')::timestamp )::text
UNION ALL
Select (('03.01.04 00:00:00')::timestamp with time zone)::text
_________________
age
29 days
1 mon
2004-03-01 00:00:00+03

т.е., по умолчанию для date-оф берется
age(timestamptz,timestamptz). А вот там - какая-то кривая логика при переходе на летнее время.
...
Рейтинг: 0 / 0
функция age(timestamp, timestamp) считает не правильно
    #32720154
ZemA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хорошо буду в timestamp приводить.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / функция age(timestamp, timestamp) считает не правильно
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]