ora-01847 when updating a record...please help

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Simon

    ora-01847 when updating a record...please help

    Hello,

    I am trying to update some varchar2 fields, which are storing dates. I
    am trying to set a 'to date' with the next minumum from date i.e

    from date | to date
    01/01/1901 01/01/1902
    01/01/1902 01/01/1903
    01/01/1903 etc......

    I have got a bit lost in creating my update statement, but cannot
    understand why I am geting the following error message:-


    ora-01847 day of month must be between 1 and last day of month.


    The sql is:-

    update emp_add_info_va lues_tab a
    set free_column10 = (select b.free_column9
    from emp_add_info_va lues_tab b
    where a.add_info_type = 'B MED INS'
    and a.free_column4 not in ('N','W')
    and a.emp_no = b.emp_no
    and b.add_info_type = 'B MED INS'
    and to_date(b.free_ column9,'DD/MM/RR') =
    (select min(to_date(c.f ree_column9,'DD/MM/RR')) from
    emp_add_info_va lues_tab c
    where c.add_info_type = 'B MED INS'
    and c.free_column4 not in ('N','W')
    and a.emp_no = c.emp_no
    and to_date(c.free_ column9,'DD/MM/RR') >
    to_date(a.free_ column9,'DD/MM/RR')))
    where exists(select b.free_column9
    from emp_add_info_va lues_tab b
    where a.add_info_type = 'B MED INS'
    and a.free_column4 not in ('N','W')
    and a.emp_no = b.emp_no
    and b.add_info_type = 'B MED INS'
    and to_date(b.free_ column9,'DD/MM/RR') =
    (select min(to_date(c.f ree_column9,'DD/MM/RR')) from
    emp_add_info_va lues_tab c
    where c.add_info_type = 'B MED INS'
    and c.free_column4 not in ('N','W')
    and a.emp_no = c.emp_no
    and to_date(c.free_ column9,'DD/MM/RR') >
    to_date(a.free_ column9,'DD/MM/RR')))


    Any help would be greatly appreciated...

    Cheers,

    Simon
  • SATYA PAL

    #2
    Re: ora-01847 when updating a record...please help

    Hi There,

    There is no issue in UPDATE statement but the data must incorrect
    stored in the table. Since you are using VARCHAR2 columna and hence it
    would allow you to store the first 2 character of date greater than
    31.

    smuckers70@hotm ail.com (Simon) wrote in message news:<c0475b73. 0406010427.57d8 0809@posting.go ogle.com>...
    Hello,
    >
    I am trying to update some varchar2 fields, which are storing dates. I
    am trying to set a 'to date' with the next minumum from date i.e
    >
    from date | to date
    01/01/1901 01/01/1902
    01/01/1902 01/01/1903
    01/01/1903 etc......
    >
    I have got a bit lost in creating my update statement, but cannot
    understand why I am geting the following error message:-
    >
    >
    ora-01847 day of month must be between 1 and last day of month.
    >
    >
    The sql is:-
    >
    update emp_add_info_va lues_tab a
    set free_column10 = (select b.free_column9
    from emp_add_info_va lues_tab b
    where a.add_info_type = 'B MED INS'
    and a.free_column4 not in ('N','W')
    and a.emp_no = b.emp_no
    and b.add_info_type = 'B MED INS'
    and to_date(b.free_ column9,'DD/MM/RR') =
    (select min(to_date(c.f ree_column9,'DD/MM/RR')) from
    emp_add_info_va lues_tab c
    where c.add_info_type = 'B MED INS'
    and c.free_column4 not in ('N','W')
    and a.emp_no = c.emp_no
    and to_date(c.free_ column9,'DD/MM/RR') >
    to_date(a.free_ column9,'DD/MM/RR')))
    where exists(select b.free_column9
    from emp_add_info_va lues_tab b
    where a.add_info_type = 'B MED INS'
    and a.free_column4 not in ('N','W')
    and a.emp_no = b.emp_no
    and b.add_info_type = 'B MED INS'
    and to_date(b.free_ column9,'DD/MM/RR') =
    (select min(to_date(c.f ree_column9,'DD/MM/RR')) from
    emp_add_info_va lues_tab c
    where c.add_info_type = 'B MED INS'
    and c.free_column4 not in ('N','W')
    and a.emp_no = c.emp_no
    and to_date(c.free_ column9,'DD/MM/RR') >
    to_date(a.free_ column9,'DD/MM/RR')))
    >
    >
    Any help would be greatly appreciated...
    >
    Cheers,
    >
    Simon

    Comment

    • Simon

      #3
      Re: ora-01847 when updating a record...please help

      not sure if I totally understand your answer...I have looked at the
      data in the table and cannot see any immediate problems. I have done a
      length on the fields

      select distinct length(b.free_c olumn9)
      from emp_add_info_va lues_tab b
      where b.add_info_type = 'B MED INS'

      which gives me 10......so they all seem the same?




      spgangwar@yahoo .com (SATYA PAL) wrote in message news:<a7b8a58b. 0406011231.4c2a 0939@posting.go ogle.com>...
      Hi There,
      >
      There is no issue in UPDATE statement but the data must incorrect
      stored in the table. Since you are using VARCHAR2 columna and hence it
      would allow you to store the first 2 character of date greater than
      31.
      >
      smuckers70@hotm ail.com (Simon) wrote in message news:<c0475b73. 0406010427.57d8 0809@posting.go ogle.com>...
      Hello,

      I am trying to update some varchar2 fields, which are storing dates. I
      am trying to set a 'to date' with the next minumum from date i.e

      from date | to date
      01/01/1901 01/01/1902
      01/01/1902 01/01/1903
      01/01/1903 etc......

      I have got a bit lost in creating my update statement, but cannot
      understand why I am geting the following error message:-


      ora-01847 day of month must be between 1 and last day of month.


      The sql is:-

      update emp_add_info_va lues_tab a
      set free_column10 = (select b.free_column9
      from emp_add_info_va lues_tab b
      where a.add_info_type = 'B MED INS'
      and a.free_column4 not in ('N','W')
      and a.emp_no = b.emp_no
      and b.add_info_type = 'B MED INS'
      and to_date(b.free_ column9,'DD/MM/RR') =
      (select min(to_date(c.f ree_column9,'DD/MM/RR')) from
      emp_add_info_va lues_tab c
      where c.add_info_type = 'B MED INS'
      and c.free_column4 not in ('N','W')
      and a.emp_no = c.emp_no
      and to_date(c.free_ column9,'DD/MM/RR') >
      to_date(a.free_ column9,'DD/MM/RR')))
      where exists(select b.free_column9
      from emp_add_info_va lues_tab b
      where a.add_info_type = 'B MED INS'
      and a.free_column4 not in ('N','W')
      and a.emp_no = b.emp_no
      and b.add_info_type = 'B MED INS'
      and to_date(b.free_ column9,'DD/MM/RR') =
      (select min(to_date(c.f ree_column9,'DD/MM/RR')) from
      emp_add_info_va lues_tab c
      where c.add_info_type = 'B MED INS'
      and c.free_column4 not in ('N','W')
      and a.emp_no = c.emp_no
      and to_date(c.free_ column9,'DD/MM/RR') >
      to_date(a.free_ column9,'DD/MM/RR')))


      Any help would be greatly appreciated...

      Cheers,

      Simon

      Comment

      • Ed prochak

        #4
        Re: ora-01847 when updating a record...please help

        smuckers70@hotm ail.com (Simon) wrote in message news:<c0475b73. 0406012327.434a 49cc@posting.go ogle.com>...
        not sure if I totally understand your answer...I have looked at the
        data in the table and cannot see any immediate problems. I have done a
        length on the fields
        >
        select distinct length(b.free_c olumn9)
        from emp_add_info_va lues_tab b
        where b.add_info_type = 'B MED INS'
        >
        which gives me 10......so they all seem the same?
        >
        >
        Why would you think the length of the text data has anything to do
        with it?
        >
        >
        spgangwar@yahoo .com (SATYA PAL) wrote in message news:<a7b8a58b. 0406011231.4c2a 0939@posting.go ogle.com>...
        Hi There,

        There is no issue in UPDATE statement but the data must incorrect
        stored in the table. Since you are using VARCHAR2 columna and hence it
        would allow you to store the first 2 character of date greater than
        31.

        smuckers70@hotm ail.com (Simon) wrote in message news:<c0475b73. 0406010427.57d8 0809@posting.go ogle.com>...
        Hello,
        >
        I am trying to update some varchar2 fields, which are storing dates. I
        am trying to set a 'to date' with the next minumum from date i.e
        >
        from date | to date
        01/01/1901 01/01/1902
        01/01/1902 01/01/1903
        01/01/1903 etc......
        >
        your sample data has date, month and 4digit year...
        I have got a bit lost in creating my update statement, but cannot
        understand why I am geting the following error message:-
        >
        >
        ora-01847 day of month must be between 1 and last day of month.
        >
        >
        The sql is:-
        >
        update emp_add_info_va lues_tab a
        set free_column10 = (select b.free_column9
        from emp_add_info_va lues_tab b
        where a.add_info_type = 'B MED INS'
        and a.free_column4 not in ('N','W')
        and a.emp_no = b.emp_no
        and b.add_info_type = 'B MED INS'
        and to_date(b.free_ column9,'DD/MM/RR') =
        but your conversion format has only the two digit year.
        []
        and to_date(c.free_ column9,'DD/MM/RR') >
        to_date(a.free_ column9,'DD/MM/RR')))
        >
        >
        Any help would be greatly appreciated...
        >
        Cheers,
        >
        Simon
        Simon,

        Are you a gambling man? I would bet there is at least one, if not many
        values in that column like '29/02/1900' or '31/09/1902' or similar bad
        dates. Want to take the bet?

        BIG HINT: You DO know that 1900 was NOT a leap year, don't you? 8^)

        Change your data model and use the DATE type for storing dates and you
        won't have this kind of insanity. Or at the very least, clean up your
        data. Text fields like this are notorious for getting bad data
        somewhere, somehow.

        HTH,
        Ed

        Comment

        • Simon

          #5
          Re: ora-01847 when updating a record...please help

          ed.prochak@magi cinterface.com (Ed prochak) wrote in message news:<4b5394b2. 0406021212.517c f9ba@posting.go ogle.com>...
          smuckers70@hotm ail.com (Simon) wrote in message news:<c0475b73. 0406012327.434a 49cc@posting.go ogle.com>...
          not sure if I totally understand your answer...I have looked at the
          data in the table and cannot see any immediate problems. I have done a
          length on the fields

          select distinct length(b.free_c olumn9)
          from emp_add_info_va lues_tab b
          where b.add_info_type = 'B MED INS'

          which gives me 10......so they all seem the same?
          Why would you think the length of the text data has anything to do
          with it?
          >


          spgangwar@yahoo .com (SATYA PAL) wrote in message news:<a7b8a58b. 0406011231.4c2a 0939@posting.go ogle.com>...
          Hi There,
          >
          There is no issue in UPDATE statement but the data must incorrect
          stored in the table. Since you are using VARCHAR2 columna and hence it
          would allow you to store the first 2 character of date greater than
          31.
          >
          smuckers70@hotm ail.com (Simon) wrote in message news:<c0475b73. 0406010427.57d8 0809@posting.go ogle.com>...
          Hello,

          I am trying to update some varchar2 fields, which are storing dates. I
          am trying to set a 'to date' with the next minumum from date i.e

          from date | to date
          01/01/1901 01/01/1902
          01/01/1902 01/01/1903
          01/01/1903 etc......
          >
          your sample data has date, month and 4digit year...
          >
          I have got a bit lost in creating my update statement, but cannot
          understand why I am geting the following error message:-


          ora-01847 day of month must be between 1 and last day of month.


          The sql is:-

          update emp_add_info_va lues_tab a
          set free_column10 = (select b.free_column9
          from emp_add_info_va lues_tab b
          where a.add_info_type = 'B MED INS'
          and a.free_column4 not in ('N','W')
          and a.emp_no = b.emp_no
          and b.add_info_type = 'B MED INS'
          and to_date(b.free_ column9,'DD/MM/RR') =
          >
          but your conversion format has only the two digit year.
          []
          and to_date(c.free_ column9,'DD/MM/RR') >
          to_date(a.free_ column9,'DD/MM/RR')))


          Any help would be greatly appreciated...

          Cheers,

          Simon
          >
          Simon,
          >
          Are you a gambling man? I would bet there is at least one, if not many
          values in that column like '29/02/1900' or '31/09/1902' or similar bad
          dates. Want to take the bet?
          >
          BIG HINT: You DO know that 1900 was NOT a leap year, don't you? 8^)
          >
          Change your data model and use the DATE type for storing dates and you
          won't have this kind of insanity. Or at the very least, clean up your
          data. Text fields like this are notorious for getting bad data
          somewhere, somehow.
          >
          HTH,
          Ed


          Ed,

          Thanks for that ..if only I could change the model!!..i am working
          with a package solution. The table is designed to hold loads of
          different types of code, so it had to be defined as varchar. The
          subsection of data I was trying to update had no invalid data
          formats...but other values in the same column did, my update statement
          must have been wrong because it was these values that were causing the
          problem.

          I have taken a lazy way out though...i created a table by selecting
          the values and updated the new table. I then deleted the old subset of
          data and reinserted the values from my new table. It worked and was
          only a one-off so I am fairly happy.

          Thanks for your help.....

          Comment

          • Ed prochak

            #6
            Re: ora-01847 when updating a record...please help

            smuckers70@hotm ail.com (Simon) wrote in message news:<c0475b73. 0406030222.6550 92cd@posting.go ogle.com>...
            []
            >
            >
            >
            Ed,
            >
            Thanks for that ..if only I could change the model!!..i am working
            with a package solution. The table is designed to hold loads of
            different types of code, so it had to be defined as varchar. The
            subsection of data I was trying to update had no invalid data
            formats...but other values in the same column did, my update statement
            must have been wrong because it was these values that were causing the
            problem.
            Not necessarily the update portion, but the WHERE clause. But does
            that mean I won the bet? Too bad I didn't put money on it. 8^)
            >
            I have taken a lazy way out though...i created a table by selecting
            the values and updated the new table. I then deleted the old subset of
            data and reinserted the values from my new table. It worked and was
            only a one-off so I am fairly happy.
            So is anyone going to go back and fix the bad dates so this doesn't
            happen next time? If you have to stay with VARCHAR at least try to
            clean it up.
            >
            Thanks for your help.....
            You are welcome. It is nice to get feedback on whether proposed
            solutions really work, so thanks to you too.

            Ed

            Comment

            • Simon

              #7
              Re: ora-01847 when updating a record...please help

              ed.prochak@magi cinterface.com (Ed prochak) wrote in message news:<4b5394b2. 0406031031.771d 9265@posting.go ogle.com>...
              smuckers70@hotm ail.com (Simon) wrote in message news:<c0475b73. 0406030222.6550 92cd@posting.go ogle.com>...
              []



              Ed,

              Thanks for that ..if only I could change the model!!..i am working
              with a package solution. The table is designed to hold loads of
              different types of code, so it had to be defined as varchar. The
              subsection of data I was trying to update had no invalid data
              formats...but other values in the same column did, my update statement
              must have been wrong because it was these values that were causing the
              problem.
              >
              Not necessarily the update portion, but the WHERE clause. But does
              that mean I won the bet? Too bad I didn't put money on it. 8^)

              Always the way isn't it! I would have one thousands on if only bets!



              >

              I have taken a lazy way out though...i created a table by selecting
              the values and updated the new table. I then deleted the old subset of
              data and reinserted the values from my new table. It worked and was
              only a one-off so I am fairly happy.
              >
              So is anyone going to go back and fix the bad dates so this doesn't
              happen next time? If you have to stay with VARCHAR at least try to
              clean it up.

              I didn't really answer you properly here, the data causing a problem
              was not 'date' data, but character based....my where clause just did
              not seperate out the correct records...why it didn't is another story,
              one that I don't really know!! If you saw some of the data models I
              had to work with, you would feel very sorry for me!!!



              Thanks for your help.....
              >
              You are welcome. It is nice to get feedback on whether proposed
              solutions really work, so thanks to you too.
              >
              Ed

              cheers......

              Comment

              Working...