Имя: Пароль:
1C
1С v8
РАЗНОСТЬДАТ в PostgreSQL
0 mistеr
 
22.12.21
10:07
Оказывается, в PostgreSQL нет функции DATEDIFF(). Во что же тогда транслируется функция РАЗНОСТЬДАТ() в запросе?

У кого под рукой база на PG и профайлер, можете посмотреть?
1 pechkin
 
22.12.21
10:09
а вот для этого и нужен был спец выпуск постгре
2 Chai Nic
 
22.12.21
10:11
(0) Наверное как-то так..

http://www.sqlines.com/postgresql/how-to/datediff
3 mistеr
 
22.12.21
10:17
(1) Не для этого.
4 FIXXXL
 
22.12.21
10:36
платформа - сила :)
5 Philix
 
22.12.21
11:05
(0) Салют!

Выбрать РАЗНОСТЬДАТ(ДАТАВРЕМЯ(2002, 12, 31, 10, 20, 34), ДАТАВРЕМЯ(2003, 01, 01, 9, 18, 06), СЕКУНДА)
превратилось в
SELECT date_part('epoch','2003-01-01 09:18:06'::timestamp - '2002-12-31 10:20:34'::timestamp)::numeric(15,0)

а
выбрать РАЗНОСТЬДАТ(ДАТАВРЕМЯ(2022, 12, 31, 00, 00, 00), ДАТАВРЕМЯ(2003, 01, 01, 9, 18, 07), месяц)
в
SELECT DATEDIFF2('MONTH','2022-12-31 00:00:00'::timestamp,'2003-01-01 09:18:07'::timestamp)::numeric(15, 0)
6 mistеr
 
22.12.21
11:12
(5) Интересно. А код DATEDIFF2 можно?
7 Philix
 
22.12.21
11:23
(6)

CREATE OR REPLACE FUNCTION public.datediff2(
    character varying,
    timestamp without time zone,
    timestamp without time zone)
    RETURNS integer
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE PARALLEL UNSAFE
AS
$BODY$
    DECLARE
     arg_mode alias for $1;
     arg_d2 alias for $2;
     arg_d1 alias for $3;
    BEGIN
    if arg_mode = 'SECOND' then
     return date_part('epoch',arg_d1) - date_part('epoch',arg_d2) ;
    elsif arg_mode = 'MINUTE' then
     return trunc((date_part('epoch',arg_d1) - date_part('epoch',arg_d2)) / 60);
    elsif arg_mode = 'HOUR' then
     return trunc((date_part('epoch',arg_d1) - date_part('epoch',arg_d2)) /3600);
    elsif arg_mode = 'DAY' then
     return cast(arg_d1 as date) - cast(arg_d2 as date);
    elsif arg_mode = 'WEEK' then
            return trunc( ( cast(arg_d1 as date) - cast(arg_d2 as date) ) / 7.0);
    elsif arg_mode = 'MONTH' then
     return 12 * (date_part('year',arg_d1) - date_part('year',arg_d2))
          + date_part('month',arg_d1) - date_part('month',arg_d2);
    elsif arg_mode = 'QUARTER' then
     return 4 * (date_part('year',arg_d1) - date_part('year',arg_d2))
          + date_part('quarter',arg_d1) - date_part('quarter',arg_d2);
    elsif arg_mode = 'YEAR' then
     return (date_part('year',arg_d1) - date_part('year',arg_d2));
   end if;
    END

$BODY$;
8 acanta
 
22.12.21
11:24
Тоже хорошо, спасибо большое
9 mistеr
 
22.12.21
11:25
(7) Благодарю.
10 pechkin
 
22.12.21
11:35
(3) и для этого в том числе
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший