I need a SQL...

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Nigel J. Andrews

    #16
    Re: I need a SQL...



    On 11 Sep 2003, Bjørn T Johansen wrote:
    [color=blue]
    > Yes, I am sure, I just use copy-and-paste and I have double checked....
    > I am running on 7.3.4 but that shouldn't make any difference?
    >
    > BTJ
    >
    > On Thu, 2003-09-11 at 14:56, Mattias Kregert wrote:[color=green]
    > > When i run it, it works as intended (on pg 7.3.3). Which version do you use?
    > >
    > > Are you absolutely sure you copied it exactly? You typed in '>=' and not '=', right?
    > >
    > > /Mattias
    > >
    > > ----- Original Message -----
    > > From: "Bjørn T Johansen" <btj@havleik.no >
    > >[color=darkred]
    > > > Well, it's close... :)
    > > >
    > > > But it looks like the case doesn't work..
    > > > If I run your sql, the timediff is negative.
    > > >
    > > > But if I run this:
    > > > SELECT (stoptime-starttime+'24 hours') as timediff FROM mytable
    > > > the timediff has correct value..
    > > >
    > > > Do you see any error in the case, cause I don't?
    > > >
    > > >
    > > > BTJ
    > > >
    > > > On Thu, 2003-09-11 at 14:29, Mattias Kregert wrote:
    > > > > Solution:
    > > > >
    > > > > SELECT starttime, stoptime, (CASE WHEN stoptime-starttime >= 0 THEN
    > > > > stoptime-starttime ELSE stoptime-starttime+'24 hours' END) as timediff
    > > > > FROM mytable;[/color][/color]
    >...[/color]

    Seems to work for me.

    test=# select case when '22:03:21'::tim e - '10:34:01'::tim e >= 0 then '22:03:21'::tim e - '10:34:01'::tim e else '22:03:21'::tim e - '10:34:01'::tim e + '24 hours' end;
    case
    ----------
    11:29:20
    (1 row)

    test=# select version();
    version
    ---------------------------------------------------------------
    PostgreSQL 7.3.4 on i686-pc-linux-gnu, compiled by GCC 2.95.4
    (1 row)


    There must be something different you are doing.

    However, is that really the correct result? What about intervals that cross
    daylight saving changes? 24 hours won't cut it in that case and you can only
    tell by storing the date not just the time of day.


    --
    Nigel J. Andrews


    ---------------------------(end of broadcast)---------------------------
    TIP 3: if posting/reading through Usenet, please send an appropriate
    subscribe-nomail command to majordomo@postg resql.org so that your
    message can get through to the mailing list cleanly

    Comment

    • Bjørn T Johansen

      #17
      Re: I need a SQL...

      Well, here is my output..:

      DT=# create table mytable (starttime time, stoptime time);
      CREATE TABLE
      DT=# insert into mytable values ('10:45', '22:30');
      INSERT 20746 1
      DT=# insert into mytable values ('19:45', '04:30');
      INSERT 20747 1
      DT=# insert into mytable values ('00:00', '00:00');
      INSERT 20748 1
      DT=# insert into mytable values ('23:59', '00:01');
      INSERT 20749 1
      DT=# insert into mytable values ('00:01', '23:59');
      INSERT 20750 1
      DT=# select starttime,stopt ime,(case when stoptime-starttime >= 0 then
      stoptime-starttime else stoptime-starttime+'24 hours' end) as timediff
      from mytable;
      starttime | stoptime | timediff
      -----------+----------+----------
      10:45:00 | 22:30:00 | 11:45
      19:45:00 | 04:30:00 | -15:15
      00:00:00 | 00:00:00 | 00:00
      23:59:00 | 00:01:00 | -23:58
      00:01:00 | 23:59:00 | 23:58
      (5 rows)

      DT=#

      Strange....

      On Thu, 2003-09-11 at 15:25, Mattias Kregert wrote:[color=blue]
      > Very strange indeed!
      >
      > This is my output.
      > ------------------------------------
      >
      > Welcome to psql 7.3.3, the PostgreSQL interactive terminal.
      >
      > Type: \copyright for distribution terms
      > \h for help with SQL commands
      > \? for help on internal slash commands
      > \g or terminate with semicolon to execute query
      > \q to quit
      >
      > test=# create table mytable (starttime time, stoptime time);
      > CREATE TABLE
      > test=# insert into mytable values ('10:45', '22:30');
      > INSERT 103688 1
      > test=# insert into mytable values ('19:45', '04:30');
      > INSERT 103689 1
      > test=# insert into mytable values ('00:00', '00:00');
      > INSERT 103690 1
      > test=# insert into mytable values ('23:59', '00:01');
      > INSERT 103691 1
      > test=# insert into mytable values ('00:01', '23:59');
      > INSERT 103692 1
      > test=# select starttime,stopt ime,(case when stoptime-starttime >= 0 then stoptime-starttime else stoptime-starttime+'24 hours' end) as timediff from mytable;
      > starttime | stoptime | timediff
      > -----------+----------+----------
      > 10:45:00 | 22:30:00 | 11:45
      > 19:45:00 | 04:30:00 | 08:45
      > 00:00:00 | 00:00:00 | 00:00
      > 23:59:00 | 00:01:00 | 00:02
      > 00:01:00 | 23:59:00 | 23:58
      > (5 rows)
      >
      > test=#
      > ------------------------------------
      >
      > As you see, it all works as it should. Can you do exactly the same and send me the complete output? If you get a different result, then it's time to send in a bug report...
      >
      > /Mattias
      >
      >
      > ----- Original Message -----
      > From: "Bjørn T Johansen" <btj@havleik.no >[color=green]
      > > Yes, I am sure, I just use copy-and-paste and I have double checked....
      > > I am running on 7.3.4 but that shouldn't make any difference?
      > >
      > > BTJ
      > >
      > > On Thu, 2003-09-11 at 14:56, Mattias Kregert wrote:[color=darkred]
      > > > When i run it, it works as intended (on pg 7.3.3). Which version do you use?
      > > >
      > > > Are you absolutely sure you copied it exactly? You typed in '>=' and not '=', right?
      > > >
      > > > /Mattias
      > > >
      > > > ----- Original Message -----
      > > > From: "Bjørn T Johansen" <btj@havleik.no >
      > > > To: "Mattias Kregert" <mattias@kreger t.se>
      > > > Cc: <pgsql-general@postgre sql.org>
      > > > Sent: Thursday, September 11, 2003 3:02 PM
      > > > Subject: Re: [GENERAL] I need a SQL...
      > > >
      > > >
      > > > > Well, it's close... :)
      > > > >
      > > > > But it looks like the case doesn't work..
      > > > > If I run your sql, the timediff is negative.
      > > > >
      > > > > But if I run this:
      > > > > SELECT (stoptime-starttime+'24 hours') as timediff FROM mytable
      > > > > the timediff has correct value..
      > > > >
      > > > > Do you see any error in the case, cause I don't?
      > > > >
      > > > >
      > > > > BTJ
      > > > >
      > > > > On Thu, 2003-09-11 at 14:29, Mattias Kregert wrote:
      > > > > > Solution:
      > > > > >
      > > > > > SELECT starttime, stoptime, (CASE WHEN stoptime-starttime >= 0 THEN
      > > > > > stoptime-starttime ELSE stoptime-starttime+'24 hours' END) as timediff
      > > > > > FROM mytable;
      > > > > >
      > > > > > /Mattias
      > > > > >
      > > > > > ----- Original Message -----
      > > > > > From: Bjørn T Johansen
      > > > > > To: Andrew L. Gould
      > > > > > Cc: PostgreSQL general list
      > > > > > Sent: Thursday, September 11, 2003 2:12 PM
      > > > > > Subject: Re: [GENERAL] I need a SQL...
      > > > > >
      > > > > > On Thu, 2003-09-11 at 14:07, Andrew L. Gould wrote:
      > > > > > > On Thursday 11 September 2003 06:25 am, Bjørn T Johansen wrote:
      > > > > > > > I need to write a SQL that calculates the interval between a start time
      > > > > > > > and a stop time. This is the easy part. The problem is that I only have
      > > > > > > > the time part, i.e. no date, so how can I be sure to also calculate the
      > > > > > > > interval if the start time is before midnight and the stop time is after
      > > > > > > > midnight?
      > > > > > > >
      > > > > > > >
      > > > > > > > Regards,
      > > > > > > >
      > > > > > > > BTJ
      > > > > > >
      > > > > > > If the activity or period you are measuring can equal or exceed 12 hours, you
      > > > > > > won't be able to calculate it reliably without a start date and a stop date.
      > > > > > > If the periods are always less than 12 hours (and you assume all the data is
      > > > > > > good), then stop times that are less than start times would indicate an
      > > > > > > intervening midnight.
      > > > > > >
      > > > > > > The dates do not have to be in the same fields as the times, since you can add
      > > > > > > date and time data to create a timestamp for datetime calculations:
      > > > > > >
      > > > > > > (stop_date + stop_time) - (start_date + start_time)
      > > > > > >
      > > > > > > Best of luck,
      > > > > > >
      > > > > > > Andrew Gould
      > > > > >
      > > > > >
      > > > > >
      > > > > > Yes, the period can exceed 12 hours, so what you are saying is that this is not possible to solve
      > > > > > without the date part? I can write this logic in my business logic but I was hoping to
      > > > > > solve this in my database layer...
      > > > > >
      > > > > >
      > > > > > BTJ
      > > > >
      > > > >
      > > > > ---------------------------(end of broadcast)---------------------------
      > > > > TIP 4: Don't 'kill -9' the postmaster
      > > > >[/color]
      > > --
      > > -----------------------------------------------------------------------------------------------
      > > Bjørn T Johansen (BSc,MNIF)
      > > Executive Manager
      > > btj@havleik.no Havleik Consulting
      > > Phone : +47 67 54 15 17 Conradisvei 4
      > > Fax : +47 67 54 13 91 N-1338 Sandvika
      > > Cellular : +47 926 93 298 http://www.havleik.no
      > > -----------------------------------------------------------------------------------------------
      > > "The stickers on the side of the box said "Supported Platforms: Windows
      > > 98, Windows NT 4.0,
      > > Windows 2000 or better", so clearly Linux was a supported platform."
      > > -----------------------------------------------------------------------------------------------
      > >
      > >
      > >
      > > ---------------------------(end of broadcast)---------------------------
      > > TIP 7: don't forget to increase your free space map settings
      > >[/color][/color]



      ---------------------------(end of broadcast)---------------------------
      TIP 2: you can get off all lists at once with the unregister command
      (send "unregister YourEmailAddres sHere" to majordomo@postg resql.org)

      Comment

      • Mattias Kregert

        #18
        Re: I need a SQL...

        This is too weird... and you are sure you haven't modified anything in pg_operator, used CREATE OPERATOR or something like that??

        I think it's time for you to send in a bug report......

        /Mattias

        ----- Original Message -----
        From: "Bjørn T Johansen" <btj@havleik.no >[color=blue]
        > Well, here is my output..:
        >
        > DT=# create table mytable (starttime time, stoptime time);
        > CREATE TABLE
        > DT=# insert into mytable values ('10:45', '22:30');
        > INSERT 20746 1
        > DT=# insert into mytable values ('19:45', '04:30');
        > INSERT 20747 1
        > DT=# insert into mytable values ('00:00', '00:00');
        > INSERT 20748 1
        > DT=# insert into mytable values ('23:59', '00:01');
        > INSERT 20749 1
        > DT=# insert into mytable values ('00:01', '23:59');
        > INSERT 20750 1
        > DT=# select starttime,stopt ime,(case when stoptime-starttime >= 0 then
        > stoptime-starttime else stoptime-starttime+'24 hours' end) as timediff
        > from mytable;
        > starttime | stoptime | timediff
        > -----------+----------+----------
        > 10:45:00 | 22:30:00 | 11:45
        > 19:45:00 | 04:30:00 | -15:15
        > 00:00:00 | 00:00:00 | 00:00
        > 23:59:00 | 00:01:00 | -23:58
        > 00:01:00 | 23:59:00 | 23:58
        > (5 rows)
        >
        > DT=#
        >
        > Strange....
        >
        > On Thu, 2003-09-11 at 15:25, Mattias Kregert wrote:[color=green]
        > > Very strange indeed!
        > >
        > > This is my output.
        > > ------------------------------------
        > >
        > > Welcome to psql 7.3.3, the PostgreSQL interactive terminal.
        > >
        > > Type: \copyright for distribution terms
        > > \h for help with SQL commands
        > > \? for help on internal slash commands
        > > \g or terminate with semicolon to execute query
        > > \q to quit
        > >
        > > test=# create table mytable (starttime time, stoptime time);
        > > CREATE TABLE
        > > test=# insert into mytable values ('10:45', '22:30');
        > > INSERT 103688 1
        > > test=# insert into mytable values ('19:45', '04:30');
        > > INSERT 103689 1
        > > test=# insert into mytable values ('00:00', '00:00');
        > > INSERT 103690 1
        > > test=# insert into mytable values ('23:59', '00:01');
        > > INSERT 103691 1
        > > test=# insert into mytable values ('00:01', '23:59');
        > > INSERT 103692 1
        > > test=# select starttime,stopt ime,(case when stoptime-starttime >= 0then stoptime-starttime else stoptime-starttime+'24 hours' end) as timediff from mytable;
        > > starttime | stoptime | timediff
        > > -----------+----------+----------
        > > 10:45:00 | 22:30:00 | 11:45
        > > 19:45:00 | 04:30:00 | 08:45
        > > 00:00:00 | 00:00:00 | 00:00
        > > 23:59:00 | 00:01:00 | 00:02
        > > 00:01:00 | 23:59:00 | 23:58
        > > (5 rows)
        > >
        > > test=#
        > > ------------------------------------
        > >
        > > As you see, it all works as it should. Can you do exactly the same and send me the complete output? If you get a different result, then it's time to send in a bug report...
        > >
        > > /Mattias
        > >
        > >
        > > ----- Original Message -----
        > > From: "Bjørn T Johansen" <btj@havleik.no >[color=darkred]
        > > > Yes, I am sure, I just use copy-and-paste and I have double checked.....
        > > > I am running on 7.3.4 but that shouldn't make any difference?
        > > >
        > > > BTJ
        > > >
        > > > On Thu, 2003-09-11 at 14:56, Mattias Kregert wrote:
        > > > > When i run it, it works as intended (on pg 7.3.3). Which version doyou use?
        > > > >
        > > > > Are you absolutely sure you copied it exactly? You typed in '>=' and not '=', right?
        > > > >
        > > > > /Mattias
        > > > >
        > > > > ----- Original Message -----
        > > > > From: "Bjørn T Johansen" <btj@havleik.no >
        > > > > To: "Mattias Kregert" <mattias@kreger t.se>
        > > > > Cc: <pgsql-general@postgre sql.org>
        > > > > Sent: Thursday, September 11, 2003 3:02 PM
        > > > > Subject: Re: [GENERAL] I need a SQL...
        > > > >
        > > > >
        > > > > > Well, it's close... :)
        > > > > >
        > > > > > But it looks like the case doesn't work..
        > > > > > If I run your sql, the timediff is negative.
        > > > > >
        > > > > > But if I run this:
        > > > > > SELECT (stoptime-starttime+'24 hours') as timediff FROM mytable
        > > > > > the timediff has correct value..
        > > > > >
        > > > > > Do you see any error in the case, cause I don't?
        > > > > >
        > > > > >
        > > > > > BTJ
        > > > > >
        > > > > > On Thu, 2003-09-11 at 14:29, Mattias Kregert wrote:
        > > > > > > Solution:
        > > > > > >
        > > > > > > SELECT starttime, stoptime, (CASE WHEN stoptime-starttime >= 0 THEN
        > > > > > > stoptime-starttime ELSE stoptime-starttime+'24 hours' END) as timediff
        > > > > > > FROM mytable;
        > > > > > >
        > > > > > > /Mattias
        > > > > > >
        > > > > > > ----- Original Message -----
        > > > > > > From: Bjørn T Johansen
        > > > > > > To: Andrew L. Gould
        > > > > > > Cc: PostgreSQL general list
        > > > > > > Sent: Thursday, September 11, 2003 2:12 PM
        > > > > > > Subject: Re: [GENERAL] I need a SQL...
        > > > > > >
        > > > > > > On Thu, 2003-09-11 at 14:07, Andrew L. Gould wrote:
        > > > > > > > On Thursday 11 September 2003 06:25 am, Bjørn T Johansen wrote:
        > > > > > > > > I need to write a SQL that calculates the interval between a start time
        > > > > > > > > and a stop time. This is the easy part. The problemis that I only have
        > > > > > > > > the time part, i.e. no date, so how can I be sure to also calculate the
        > > > > > > > > interval if the start time is before midnight and the stop time is after
        > > > > > > > > midnight?
        > > > > > > > >
        > > > > > > > >
        > > > > > > > > Regards,
        > > > > > > > >
        > > > > > > > > BTJ
        > > > > > > >
        > > > > > > > If the activity or period you are measuring can equalor exceed 12 hours, you
        > > > > > > > won't be able to calculate it reliably without a start date and a stop date.
        > > > > > > > If the periods are always less than 12 hours (and youassume all the data is
        > > > > > > > good), then stop times that are less than start timeswould indicate an
        > > > > > > > intervening midnight.
        > > > > > > >
        > > > > > > > The dates do not have to be in the same fields as thetimes, since you can add
        > > > > > > > date and time data to create a timestamp for datetimecalcula tions:
        > > > > > > >
        > > > > > > > (stop_date + stop_time) - (start_date + start_time)
        > > > > > > >
        > > > > > > > Best of luck,
        > > > > > > >
        > > > > > > > Andrew Gould
        > > > > > >
        > > > > > >
        > > > > > >
        > > > > > > Yes, the period can exceed 12 hours, so what you are saying is that this is not possible to solve
        > > > > > > without the date part? I can write this logic in my business logic but I was hoping to
        > > > > > > solve this in my database layer...
        > > > > > >
        > > > > > >
        > > > > > > BTJ
        > > > > >
        > > > > >
        > > > > > ---------------------------(end of broadcast)---------------------------
        > > > > > TIP 4: Don't 'kill -9' the postmaster
        > > > > >
        > > > --
        > > > -----------------------------------------------------------------------------------------------
        > > > Bjørn T Johansen (BSc,MNIF)
        > > > Executive Manager
        > > > btj@havleik.no Havleik Consulting
        > > > Phone : +47 67 54 15 17 Conradisvei 4
        > > > Fax : +47 67 54 13 91 N-1338 Sandvika
        > > > Cellular : +47 926 93 298 http://www.havleik.no
        > > > -----------------------------------------------------------------------------------------------
        > > > "The stickers on the side of the box said "Supported Platforms: Windows
        > > > 98, Windows NT 4.0,
        > > > Windows 2000 or better", so clearly Linux was a supported platform."
        > > > -----------------------------------------------------------------------------------------------
        > > >
        > > >
        > > >
        > > > ---------------------------(end of broadcast)---------------------------
        > > > TIP 7: don't forget to increase your free space map settings
        > > > [/color][/color]
        >
        >[/color]

        ---------------------------(end of broadcast)---------------------------
        TIP 6: Have you searched our list archives?



        Comment

        • Tom Lane

          #19
          Re: I need a SQL...

          =?ISO-8859-1?Q?Bj=F8rn?= T Johansen <btj@havleik.no > writes:[color=blue]
          > Yes, I am sure, I just use copy-and-paste and I have double checked....
          > I am running on 7.3.4 but that shouldn't make any difference?[/color]

          It'll probably work better if you quote the zero. Unquoted, you get
          some weird textual comparison. Compare:

          regression=# explain select * from time_tbl where f1-f1 >= 0;
          QUERY PLAN
          --------------------------------------------------------
          Seq Scan on time_tbl (cost=0.00..1.1 4 rows=3 width=8)
          Filter: (((f1 - f1))::text >= '0'::text)
          (2 rows)

          regression=# explain select * from time_tbl where f1-f1 >= '0';
          QUERY PLAN
          --------------------------------------------------------
          Seq Scan on time_tbl (cost=0.00..1.1 2 rows=3 width=8)
          Filter: ((f1 - f1) >= '00:00'::interv al)
          (2 rows)

          In "C" locale, the textual comparison accidentally manages to give
          the desired answers, but in other locales it would not.

          (Just another example of why implicit coercions to text are evil.)

          regards, tom lane

          ---------------------------(end of broadcast)---------------------------
          TIP 1: subscribe and unsubscribe commands go to majordomo@postg resql.org

          Comment

          • Bjørn T Johansen

            #20
            Re: I need a SQL...

            Well, here is my output..:

            DT=# create table mytable (starttime time, stoptime time);
            CREATE TABLE
            DT=# insert into mytable values ('10:45', '22:30');
            INSERT 20746 1
            DT=# insert into mytable values ('19:45', '04:30');
            INSERT 20747 1
            DT=# insert into mytable values ('00:00', '00:00');
            INSERT 20748 1
            DT=# insert into mytable values ('23:59', '00:01');
            INSERT 20749 1
            DT=# insert into mytable values ('00:01', '23:59');
            INSERT 20750 1
            DT=# select starttime,stopt ime,(case when stoptime-starttime >= 0 then
            stoptime-starttime else stoptime-starttime+'24 hours' end) as timediff
            from mytable;
            starttime | stoptime | timediff
            -----------+----------+----------
            10:45:00 | 22:30:00 | 11:45
            19:45:00 | 04:30:00 | -15:15
            00:00:00 | 00:00:00 | 00:00
            23:59:00 | 00:01:00 | -23:58
            00:01:00 | 23:59:00 | 23:58
            (5 rows)

            DT=#

            Strange....

            On Thu, 2003-09-11 at 15:25, Mattias Kregert wrote:[color=blue]
            > Very strange indeed!
            >
            > This is my output.
            > ------------------------------------
            >
            > Welcome to psql 7.3.3, the PostgreSQL interactive terminal.
            >
            > Type: \copyright for distribution terms
            > \h for help with SQL commands
            > \? for help on internal slash commands
            > \g or terminate with semicolon to execute query
            > \q to quit
            >
            > test=# create table mytable (starttime time, stoptime time);
            > CREATE TABLE
            > test=# insert into mytable values ('10:45', '22:30');
            > INSERT 103688 1
            > test=# insert into mytable values ('19:45', '04:30');
            > INSERT 103689 1
            > test=# insert into mytable values ('00:00', '00:00');
            > INSERT 103690 1
            > test=# insert into mytable values ('23:59', '00:01');
            > INSERT 103691 1
            > test=# insert into mytable values ('00:01', '23:59');
            > INSERT 103692 1
            > test=# select starttime,stopt ime,(case when stoptime-starttime >= 0 then stoptime-starttime else stoptime-starttime+'24 hours' end) as timediff from mytable;
            > starttime | stoptime | timediff
            > -----------+----------+----------
            > 10:45:00 | 22:30:00 | 11:45
            > 19:45:00 | 04:30:00 | 08:45
            > 00:00:00 | 00:00:00 | 00:00
            > 23:59:00 | 00:01:00 | 00:02
            > 00:01:00 | 23:59:00 | 23:58
            > (5 rows)
            >
            > test=#
            > ------------------------------------
            >
            > As you see, it all works as it should. Can you do exactly the same and send me the complete output? If you get a different result, then it's time to send in a bug report...
            >
            > /Mattias
            >
            >
            > ----- Original Message -----
            > From: "Bjørn T Johansen" <btj@havleik.no >[color=green]
            > > Yes, I am sure, I just use copy-and-paste and I have double checked....
            > > I am running on 7.3.4 but that shouldn't make any difference?
            > >
            > > BTJ
            > >
            > > On Thu, 2003-09-11 at 14:56, Mattias Kregert wrote:[color=darkred]
            > > > When i run it, it works as intended (on pg 7.3.3). Which version do you use?
            > > >
            > > > Are you absolutely sure you copied it exactly? You typed in '>=' and not '=', right?
            > > >
            > > > /Mattias
            > > >
            > > > ----- Original Message -----
            > > > From: "Bjørn T Johansen" <btj@havleik.no >
            > > > To: "Mattias Kregert" <mattias@kreger t.se>
            > > > Cc: <pgsql-general@postgre sql.org>
            > > > Sent: Thursday, September 11, 2003 3:02 PM
            > > > Subject: Re: [GENERAL] I need a SQL...
            > > >
            > > >
            > > > > Well, it's close... :)
            > > > >
            > > > > But it looks like the case doesn't work..
            > > > > If I run your sql, the timediff is negative.
            > > > >
            > > > > But if I run this:
            > > > > SELECT (stoptime-starttime+'24 hours') as timediff FROM mytable
            > > > > the timediff has correct value..
            > > > >
            > > > > Do you see any error in the case, cause I don't?
            > > > >
            > > > >
            > > > > BTJ
            > > > >
            > > > > On Thu, 2003-09-11 at 14:29, Mattias Kregert wrote:
            > > > > > Solution:
            > > > > >
            > > > > > SELECT starttime, stoptime, (CASE WHEN stoptime-starttime >= 0 THEN
            > > > > > stoptime-starttime ELSE stoptime-starttime+'24 hours' END) as timediff
            > > > > > FROM mytable;
            > > > > >
            > > > > > /Mattias
            > > > > >
            > > > > > ----- Original Message -----
            > > > > > From: Bjørn T Johansen
            > > > > > To: Andrew L. Gould
            > > > > > Cc: PostgreSQL general list
            > > > > > Sent: Thursday, September 11, 2003 2:12 PM
            > > > > > Subject: Re: [GENERAL] I need a SQL...
            > > > > >
            > > > > > On Thu, 2003-09-11 at 14:07, Andrew L. Gould wrote:
            > > > > > > On Thursday 11 September 2003 06:25 am, Bjørn T Johansen wrote:
            > > > > > > > I need to write a SQL that calculates the interval between a start time
            > > > > > > > and a stop time. This is the easy part. The problem is that I only have
            > > > > > > > the time part, i.e. no date, so how can I be sure to also calculate the
            > > > > > > > interval if the start time is before midnight and the stop time is after
            > > > > > > > midnight?
            > > > > > > >
            > > > > > > >
            > > > > > > > Regards,
            > > > > > > >
            > > > > > > > BTJ
            > > > > > >
            > > > > > > If the activity or period you are measuring can equal or exceed 12 hours, you
            > > > > > > won't be able to calculate it reliably without a start date and a stop date.
            > > > > > > If the periods are always less than 12 hours (and you assume all the data is
            > > > > > > good), then stop times that are less than start times would indicate an
            > > > > > > intervening midnight.
            > > > > > >
            > > > > > > The dates do not have to be in the same fields as the times, since you can add
            > > > > > > date and time data to create a timestamp for datetime calculations:
            > > > > > >
            > > > > > > (stop_date + stop_time) - (start_date + start_time)
            > > > > > >
            > > > > > > Best of luck,
            > > > > > >
            > > > > > > Andrew Gould
            > > > > >
            > > > > >
            > > > > >
            > > > > > Yes, the period can exceed 12 hours, so what you are saying is that this is not possible to solve
            > > > > > without the date part? I can write this logic in my business logic but I was hoping to
            > > > > > solve this in my database layer...
            > > > > >
            > > > > >
            > > > > > BTJ
            > > > >
            > > > >
            > > > > ---------------------------(end of broadcast)---------------------------
            > > > > TIP 4: Don't 'kill -9' the postmaster
            > > > >[/color]
            > > --
            > > -----------------------------------------------------------------------------------------------
            > > Bjørn T Johansen (BSc,MNIF)
            > > Executive Manager
            > > btj@havleik.no Havleik Consulting
            > > Phone : +47 67 54 15 17 Conradisvei 4
            > > Fax : +47 67 54 13 91 N-1338 Sandvika
            > > Cellular : +47 926 93 298 http://www.havleik.no
            > > -----------------------------------------------------------------------------------------------
            > > "The stickers on the side of the box said "Supported Platforms: Windows
            > > 98, Windows NT 4.0,
            > > Windows 2000 or better", so clearly Linux was a supported platform."
            > > -----------------------------------------------------------------------------------------------
            > >
            > >
            > >
            > > ---------------------------(end of broadcast)---------------------------
            > > TIP 7: don't forget to increase your free space map settings
            > >[/color][/color]



            ---------------------------(end of broadcast)---------------------------
            TIP 2: you can get off all lists at once with the unregister command
            (send "unregister YourEmailAddres sHere" to majordomo@postg resql.org)

            Comment

            • Mattias Kregert

              #21
              Re: I need a SQL...

              This is too weird... and you are sure you haven't modified anything in pg_operator, used CREATE OPERATOR or something like that??

              I think it's time for you to send in a bug report......

              /Mattias

              ----- Original Message -----
              From: "Bjørn T Johansen" <btj@havleik.no >[color=blue]
              > Well, here is my output..:
              >
              > DT=# create table mytable (starttime time, stoptime time);
              > CREATE TABLE
              > DT=# insert into mytable values ('10:45', '22:30');
              > INSERT 20746 1
              > DT=# insert into mytable values ('19:45', '04:30');
              > INSERT 20747 1
              > DT=# insert into mytable values ('00:00', '00:00');
              > INSERT 20748 1
              > DT=# insert into mytable values ('23:59', '00:01');
              > INSERT 20749 1
              > DT=# insert into mytable values ('00:01', '23:59');
              > INSERT 20750 1
              > DT=# select starttime,stopt ime,(case when stoptime-starttime >= 0 then
              > stoptime-starttime else stoptime-starttime+'24 hours' end) as timediff
              > from mytable;
              > starttime | stoptime | timediff
              > -----------+----------+----------
              > 10:45:00 | 22:30:00 | 11:45
              > 19:45:00 | 04:30:00 | -15:15
              > 00:00:00 | 00:00:00 | 00:00
              > 23:59:00 | 00:01:00 | -23:58
              > 00:01:00 | 23:59:00 | 23:58
              > (5 rows)
              >
              > DT=#
              >
              > Strange....
              >
              > On Thu, 2003-09-11 at 15:25, Mattias Kregert wrote:[color=green]
              > > Very strange indeed!
              > >
              > > This is my output.
              > > ------------------------------------
              > >
              > > Welcome to psql 7.3.3, the PostgreSQL interactive terminal.
              > >
              > > Type: \copyright for distribution terms
              > > \h for help with SQL commands
              > > \? for help on internal slash commands
              > > \g or terminate with semicolon to execute query
              > > \q to quit
              > >
              > > test=# create table mytable (starttime time, stoptime time);
              > > CREATE TABLE
              > > test=# insert into mytable values ('10:45', '22:30');
              > > INSERT 103688 1
              > > test=# insert into mytable values ('19:45', '04:30');
              > > INSERT 103689 1
              > > test=# insert into mytable values ('00:00', '00:00');
              > > INSERT 103690 1
              > > test=# insert into mytable values ('23:59', '00:01');
              > > INSERT 103691 1
              > > test=# insert into mytable values ('00:01', '23:59');
              > > INSERT 103692 1
              > > test=# select starttime,stopt ime,(case when stoptime-starttime >= 0then stoptime-starttime else stoptime-starttime+'24 hours' end) as timediff from mytable;
              > > starttime | stoptime | timediff
              > > -----------+----------+----------
              > > 10:45:00 | 22:30:00 | 11:45
              > > 19:45:00 | 04:30:00 | 08:45
              > > 00:00:00 | 00:00:00 | 00:00
              > > 23:59:00 | 00:01:00 | 00:02
              > > 00:01:00 | 23:59:00 | 23:58
              > > (5 rows)
              > >
              > > test=#
              > > ------------------------------------
              > >
              > > As you see, it all works as it should. Can you do exactly the same and send me the complete output? If you get a different result, then it's time to send in a bug report...
              > >
              > > /Mattias
              > >
              > >
              > > ----- Original Message -----
              > > From: "Bjørn T Johansen" <btj@havleik.no >[color=darkred]
              > > > Yes, I am sure, I just use copy-and-paste and I have double checked.....
              > > > I am running on 7.3.4 but that shouldn't make any difference?
              > > >
              > > > BTJ
              > > >
              > > > On Thu, 2003-09-11 at 14:56, Mattias Kregert wrote:
              > > > > When i run it, it works as intended (on pg 7.3.3). Which version doyou use?
              > > > >
              > > > > Are you absolutely sure you copied it exactly? You typed in '>=' and not '=', right?
              > > > >
              > > > > /Mattias
              > > > >
              > > > > ----- Original Message -----
              > > > > From: "Bjørn T Johansen" <btj@havleik.no >
              > > > > To: "Mattias Kregert" <mattias@kreger t.se>
              > > > > Cc: <pgsql-general@postgre sql.org>
              > > > > Sent: Thursday, September 11, 2003 3:02 PM
              > > > > Subject: Re: [GENERAL] I need a SQL...
              > > > >
              > > > >
              > > > > > Well, it's close... :)
              > > > > >
              > > > > > But it looks like the case doesn't work..
              > > > > > If I run your sql, the timediff is negative.
              > > > > >
              > > > > > But if I run this:
              > > > > > SELECT (stoptime-starttime+'24 hours') as timediff FROM mytable
              > > > > > the timediff has correct value..
              > > > > >
              > > > > > Do you see any error in the case, cause I don't?
              > > > > >
              > > > > >
              > > > > > BTJ
              > > > > >
              > > > > > On Thu, 2003-09-11 at 14:29, Mattias Kregert wrote:
              > > > > > > Solution:
              > > > > > >
              > > > > > > SELECT starttime, stoptime, (CASE WHEN stoptime-starttime >= 0 THEN
              > > > > > > stoptime-starttime ELSE stoptime-starttime+'24 hours' END) as timediff
              > > > > > > FROM mytable;
              > > > > > >
              > > > > > > /Mattias
              > > > > > >
              > > > > > > ----- Original Message -----
              > > > > > > From: Bjørn T Johansen
              > > > > > > To: Andrew L. Gould
              > > > > > > Cc: PostgreSQL general list
              > > > > > > Sent: Thursday, September 11, 2003 2:12 PM
              > > > > > > Subject: Re: [GENERAL] I need a SQL...
              > > > > > >
              > > > > > > On Thu, 2003-09-11 at 14:07, Andrew L. Gould wrote:
              > > > > > > > On Thursday 11 September 2003 06:25 am, Bjørn T Johansen wrote:
              > > > > > > > > I need to write a SQL that calculates the interval between a start time
              > > > > > > > > and a stop time. This is the easy part. The problemis that I only have
              > > > > > > > > the time part, i.e. no date, so how can I be sure to also calculate the
              > > > > > > > > interval if the start time is before midnight and the stop time is after
              > > > > > > > > midnight?
              > > > > > > > >
              > > > > > > > >
              > > > > > > > > Regards,
              > > > > > > > >
              > > > > > > > > BTJ
              > > > > > > >
              > > > > > > > If the activity or period you are measuring can equalor exceed 12 hours, you
              > > > > > > > won't be able to calculate it reliably without a start date and a stop date.
              > > > > > > > If the periods are always less than 12 hours (and youassume all the data is
              > > > > > > > good), then stop times that are less than start timeswould indicate an
              > > > > > > > intervening midnight.
              > > > > > > >
              > > > > > > > The dates do not have to be in the same fields as thetimes, since you can add
              > > > > > > > date and time data to create a timestamp for datetimecalcula tions:
              > > > > > > >
              > > > > > > > (stop_date + stop_time) - (start_date + start_time)
              > > > > > > >
              > > > > > > > Best of luck,
              > > > > > > >
              > > > > > > > Andrew Gould
              > > > > > >
              > > > > > >
              > > > > > >
              > > > > > > Yes, the period can exceed 12 hours, so what you are saying is that this is not possible to solve
              > > > > > > without the date part? I can write this logic in my business logic but I was hoping to
              > > > > > > solve this in my database layer...
              > > > > > >
              > > > > > >
              > > > > > > BTJ
              > > > > >
              > > > > >
              > > > > > ---------------------------(end of broadcast)---------------------------
              > > > > > TIP 4: Don't 'kill -9' the postmaster
              > > > > >
              > > > --
              > > > -----------------------------------------------------------------------------------------------
              > > > Bjørn T Johansen (BSc,MNIF)
              > > > Executive Manager
              > > > btj@havleik.no Havleik Consulting
              > > > Phone : +47 67 54 15 17 Conradisvei 4
              > > > Fax : +47 67 54 13 91 N-1338 Sandvika
              > > > Cellular : +47 926 93 298 http://www.havleik.no
              > > > -----------------------------------------------------------------------------------------------
              > > > "The stickers on the side of the box said "Supported Platforms: Windows
              > > > 98, Windows NT 4.0,
              > > > Windows 2000 or better", so clearly Linux was a supported platform."
              > > > -----------------------------------------------------------------------------------------------
              > > >
              > > >
              > > >
              > > > ---------------------------(end of broadcast)---------------------------
              > > > TIP 7: don't forget to increase your free space map settings
              > > > [/color][/color]
              >
              >[/color]

              ---------------------------(end of broadcast)---------------------------
              TIP 6: Have you searched our list archives?



              Comment

              • Bjørn T Johansen

                #22
                Re: I need a SQL...

                You are absoletely correct, quoting the zero did the trick...
                And my database has been intialized with Norwegian local, so I am
                guessing that that's reason....

                Thanks to all fo you... :)


                BTJ


                On Thu, 2003-09-11 at 16:26, Tom Lane wrote:[color=blue]
                > =?ISO-8859-1?Q?Bj=F8rn?= T Johansen <btj@havleik.no > writes:[color=green]
                > > Yes, I am sure, I just use copy-and-paste and I have double checked....
                > > I am running on 7.3.4 but that shouldn't make any difference?[/color]
                >
                > It'll probably work better if you quote the zero. Unquoted, you get
                > some weird textual comparison. Compare:
                >
                > regression=# explain select * from time_tbl where f1-f1 >= 0;
                > QUERY PLAN
                > --------------------------------------------------------
                > Seq Scan on time_tbl (cost=0.00..1.1 4 rows=3 width=8)
                > Filter: (((f1 - f1))::text >= '0'::text)
                > (2 rows)
                >
                > regression=# explain select * from time_tbl where f1-f1 >= '0';
                > QUERY PLAN
                > --------------------------------------------------------
                > Seq Scan on time_tbl (cost=0.00..1.1 2 rows=3 width=8)
                > Filter: ((f1 - f1) >= '00:00'::interv al)
                > (2 rows)
                >
                > In "C" locale, the textual comparison accidentally manages to give
                > the desired answers, but in other locales it would not.
                >
                > (Just another example of why implicit coercions to text are evil.)
                >
                > regards, tom lane[/color]



                ---------------------------(end of broadcast)---------------------------
                TIP 6: Have you searched our list archives?



                Comment

                • Tom Lane

                  #23
                  Re: I need a SQL...

                  =?ISO-8859-1?Q?Bj=F8rn?= T Johansen <btj@havleik.no > writes:[color=blue]
                  > Yes, I am sure, I just use copy-and-paste and I have double checked....
                  > I am running on 7.3.4 but that shouldn't make any difference?[/color]

                  It'll probably work better if you quote the zero. Unquoted, you get
                  some weird textual comparison. Compare:

                  regression=# explain select * from time_tbl where f1-f1 >= 0;
                  QUERY PLAN
                  --------------------------------------------------------
                  Seq Scan on time_tbl (cost=0.00..1.1 4 rows=3 width=8)
                  Filter: (((f1 - f1))::text >= '0'::text)
                  (2 rows)

                  regression=# explain select * from time_tbl where f1-f1 >= '0';
                  QUERY PLAN
                  --------------------------------------------------------
                  Seq Scan on time_tbl (cost=0.00..1.1 2 rows=3 width=8)
                  Filter: ((f1 - f1) >= '00:00'::interv al)
                  (2 rows)

                  In "C" locale, the textual comparison accidentally manages to give
                  the desired answers, but in other locales it would not.

                  (Just another example of why implicit coercions to text are evil.)

                  regards, tom lane

                  ---------------------------(end of broadcast)---------------------------
                  TIP 1: subscribe and unsubscribe commands go to majordomo@postg resql.org

                  Comment

                  • Bjørn T Johansen

                    #24
                    Re: I need a SQL...

                    You are absoletely correct, quoting the zero did the trick...
                    And my database has been intialized with Norwegian local, so I am
                    guessing that that's reason....

                    Thanks to all fo you... :)


                    BTJ


                    On Thu, 2003-09-11 at 16:26, Tom Lane wrote:[color=blue]
                    > =?ISO-8859-1?Q?Bj=F8rn?= T Johansen <btj@havleik.no > writes:[color=green]
                    > > Yes, I am sure, I just use copy-and-paste and I have double checked....
                    > > I am running on 7.3.4 but that shouldn't make any difference?[/color]
                    >
                    > It'll probably work better if you quote the zero. Unquoted, you get
                    > some weird textual comparison. Compare:
                    >
                    > regression=# explain select * from time_tbl where f1-f1 >= 0;
                    > QUERY PLAN
                    > --------------------------------------------------------
                    > Seq Scan on time_tbl (cost=0.00..1.1 4 rows=3 width=8)
                    > Filter: (((f1 - f1))::text >= '0'::text)
                    > (2 rows)
                    >
                    > regression=# explain select * from time_tbl where f1-f1 >= '0';
                    > QUERY PLAN
                    > --------------------------------------------------------
                    > Seq Scan on time_tbl (cost=0.00..1.1 2 rows=3 width=8)
                    > Filter: ((f1 - f1) >= '00:00'::interv al)
                    > (2 rows)
                    >
                    > In "C" locale, the textual comparison accidentally manages to give
                    > the desired answers, but in other locales it would not.
                    >
                    > (Just another example of why implicit coercions to text are evil.)
                    >
                    > regards, tom lane[/color]



                    ---------------------------(end of broadcast)---------------------------
                    TIP 6: Have you searched our list archives?



                    Comment

                    • Adam Kavan

                      #25
                      Re: I need a SQL...

                      [color=blue]
                      >
                      >Yes, the period can exceed 12 hours, so what you are saying is that this
                      >is not possible to solve without the date part? I can write this logic in
                      >my business logic but I was hoping to solve this in my database layer... BTJ[/color]


                      How about SELECT CASE WHEN "StartTime" > "EndTime" THEN
                      '23:59:99.99999 999999'::time - "StartTime" + "EndTime" ELSE
                      "EndTime"-"StartTime" END FROM "TimeTable" ;

                      --- Adam Kavan
                      --- akavan@cox.net



                      ---------------------------(end of broadcast)---------------------------
                      TIP 9: the planner will ignore your desire to choose an index scan if your
                      joining column's datatypes do not match

                      Comment

                      • Adam Kavan

                        #26
                        Re: I need a SQL...

                        [color=blue]
                        >
                        >Yes, the period can exceed 12 hours, so what you are saying is that this
                        >is not possible to solve without the date part? I can write this logic in
                        >my business logic but I was hoping to solve this in my database layer... BTJ[/color]


                        How about SELECT CASE WHEN "StartTime" > "EndTime" THEN
                        '23:59:99.99999 999999'::time - "StartTime" + "EndTime" ELSE
                        "EndTime"-"StartTime" END FROM "TimeTable" ;

                        --- Adam Kavan
                        --- akavan@cox.net



                        ---------------------------(end of broadcast)---------------------------
                        TIP 9: the planner will ignore your desire to choose an index scan if your
                        joining column's datatypes do not match

                        Comment

                        Working...