Обсуждение: timestamp and calculations.

Поиск
Список
Период
Сортировка

timestamp and calculations.

От
Thor Tall
Дата:
Hi,

I am new to postgres sql and have a problem with an
sql statement which I hope you can help me with.

I want to do some calculation on the result of a
query.

I have a table tb_test which contains a timestamp
column my_timestamp.

My sql statement should display my_timestamp  as "00",
"20", "40" where all timestamps with minutes between
"00" and until "20" should be displayed as "00" and
"20"  until "40" as "20" and "40"
until "00" as "40"

-- period_count = The number of periods we need to
calculate data for. (default 3)
-- start_time   = The time of the first period.
--   must be full hour '2005-10-24 02:00:00'
-- delta_time   = The length of each period in
minutes. (default 20)
------
select
  <start_time> + ((a.my_timestamp -
<start_time>)/<delta_time>) * <delta_time> as ts,
  ((a.my_timestamp - <start_time>)/<delta_time>) + 1
as Period
from tb_test as a
where
  a.my_timestamp >= <start_time> and a.ETI <
((<period_count> + <period_count> - 1) * <delta_time>
+ <start_time>)

My problem is that I cannot get the calculation to
work as I have a problem with the convertion between
timestamp and integer numbers. i.e. <delta_time> and
<period_count>.

Thanks,
Thor.


__________________________________________________
Do You Yahoo!?
Tired of spam?  Yahoo! Mail has the best spam protection around
http://mail.yahoo.com

Re: timestamp and calculations.

От
Andreas Kretschmer
Дата:
Thor Tall <tall_thor@yahoo.com> schrieb:

> Hi,
>
> I am new to postgres sql and have a problem with an
> sql statement which I hope you can help me with.
>
> I want to do some calculation on the result of a
> query.
>
> I have a table tb_test which contains a timestamp
> column my_timestamp.
>
> My sql statement should display my_timestamp  as "00",
> "20", "40" where all timestamps with minutes between
> "00" and until "20" should be displayed as "00" and
> "20"  until "40" as "20" and "40"
> until "00" as "40"

Something like this:

test=# select * from times;
          t
---------------------
 2006-07-20 10:00:00
 2006-07-20 10:05:00
 2006-07-20 10:10:00
 2006-07-20 10:15:00
 2006-07-20 10:20:00
 2006-07-20 10:25:00
 2006-07-20 10:35:00
 2006-07-20 10:45:00
(8 rows)

select t,
    extract(minute from t) / 20,
    case floor((extract(minute from t) / 20))
        when 0 then '00'
        when 1 then '20'
        when 2 then '40'
    end
from times;

          t          | ?column? | case
---------------------+----------+------
 2006-07-20 10:00:00 |        0 | 00
 2006-07-20 10:05:00 |     0.25 | 00
 2006-07-20 10:10:00 |      0.5 | 00
 2006-07-20 10:15:00 |     0.75 | 00
 2006-07-20 10:20:00 |        1 | 20
 2006-07-20 10:25:00 |     1.25 | 20
 2006-07-20 10:35:00 |     1.75 | 20
 2006-07-20 10:45:00 |     2.25 | 40
(8 rows)




HTH, Andreas
--
Really, I'm not out to destroy Microsoft. That will just be a completely
unintentional side effect.                              (Linus Torvalds)
"If I was god, I would recompile penguin with --enable-fly."    (unknow)
Kaufbach, Saxony, Germany, Europe.              N 51.05082°, E 13.56889°

Re: timestamp and calculations.

От
Sven Willenberger
Дата:
On Thu, 2006-07-20 at 11:57 +0200, Andreas Kretschmer wrote:
> Thor Tall <tall_thor@yahoo.com> schrieb:
>
> > Hi,
> >
> > I am new to postgres sql and have a problem with an
> > sql statement which I hope you can help me with.
> >
> > I want to do some calculation on the result of a
> > query.
> >
> > I have a table tb_test which contains a timestamp
> > column my_timestamp.
> >
> > My sql statement should display my_timestamp  as "00",
> > "20", "40" where all timestamps with minutes between
> > "00" and until "20" should be displayed as "00" and
> > "20"  until "40" as "20" and "40"
> > until "00" as "40"
>
> Something like this:
>
> test=# select * from times;
>           t
> ---------------------
>  2006-07-20 10:00:00
>  2006-07-20 10:05:00
>  2006-07-20 10:10:00
>  2006-07-20 10:15:00
>  2006-07-20 10:20:00
>  2006-07-20 10:25:00
>  2006-07-20 10:35:00
>  2006-07-20 10:45:00
> (8 rows)
>
> select t,
>     extract(minute from t) / 20,
>     case floor((extract(minute from t) / 20))
>         when 0 then '00'
>         when 1 then '20'
>         when 2 then '40'
>     end
> from times;
>
>           t          | ?column? | case
> ---------------------+----------+------
>  2006-07-20 10:00:00 |        0 | 00
>  2006-07-20 10:05:00 |     0.25 | 00
>  2006-07-20 10:10:00 |      0.5 | 00
>  2006-07-20 10:15:00 |     0.75 | 00
>  2006-07-20 10:20:00 |        1 | 20
>  2006-07-20 10:25:00 |     1.25 | 20
>  2006-07-20 10:35:00 |     1.75 | 20
>  2006-07-20 10:45:00 |     2.25 | 40
> (8 rows)
>
>
>
>
> HTH, Andreas

Alternatively:

select lpad((floor((extract (minute from my_timestamp) / 20)) * 20)::text,2,'0')

Sven