Skip to Main Content

SQL & PL/SQL

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

Date problem (looks like a bug)

DonbotOct 8 2009 — edited Oct 8 2009
This is on ORACLE 10.2.0.4.0

I am working on an SQL query to return calendar dates.
When I run this:
SELECT workdate
FROM
(
  SELECT TO_DATE(TO_CHAR(m.month) || '/' || TO_CHAR(d.day) || '/' || TO_CHAR(y.year), 'MM/DD/YYYY') AS workdate
  FROM
  (
    (
      SELECT 2011 AS year FROM dual
    ) y
    CROSS JOIN
    (
                SELECT  1 AS month FROM dual
      UNION ALL SELECT  2 AS month FROM dual
      UNION ALL SELECT  3 AS month FROM dual
      UNION ALL SELECT  4 AS month FROM dual
      UNION ALL SELECT  5 AS month FROM dual
      UNION ALL SELECT  6 AS month FROM dual
      UNION ALL SELECT  7 AS month FROM dual
      UNION ALL SELECT  8 AS month FROM dual
      UNION ALL SELECT  9 AS month FROM dual
      UNION ALL SELECT 10 AS month FROM dual
      UNION ALL SELECT 11 AS month FROM dual
      UNION ALL SELECT 12 AS month FROM dual
    ) m
  )
  JOIN
  (
              SELECT  1 AS day FROM dual
    UNION ALL SELECT  2 AS day FROM dual
    UNION ALL SELECT  3 AS day FROM dual
    UNION ALL SELECT  4 AS day FROM dual
    UNION ALL SELECT  5 AS day FROM dual
    UNION ALL SELECT  6 AS day FROM dual
    UNION ALL SELECT  7 AS day FROM dual
    UNION ALL SELECT  8 AS day FROM dual
    UNION ALL SELECT  9 AS day FROM dual
    UNION ALL SELECT 10 AS day FROM dual
    UNION ALL SELECT 11 AS day FROM dual
    UNION ALL SELECT 12 AS day FROM dual
    UNION ALL SELECT 13 AS day FROM dual
    UNION ALL SELECT 14 AS day FROM dual
    UNION ALL SELECT 15 AS day FROM dual
    UNION ALL SELECT 16 AS day FROM dual
    UNION ALL SELECT 17 AS day FROM dual
    UNION ALL SELECT 18 AS day FROM dual
    UNION ALL SELECT 19 AS day FROM dual
    UNION ALL SELECT 20 AS day FROM dual
    UNION ALL SELECT 21 AS day FROM dual
    UNION ALL SELECT 22 AS day FROM dual
    UNION ALL SELECT 23 AS day FROM dual
    UNION ALL SELECT 24 AS day FROM dual
    UNION ALL SELECT 25 AS day FROM dual
    UNION ALL SELECT 26 AS day FROM dual
    UNION ALL SELECT 27 AS day FROM dual
    UNION ALL SELECT 28 AS day FROM dual
    UNION ALL SELECT 29 AS day FROM dual
    UNION ALL SELECT 30 AS day FROM dual
    UNION ALL SELECT 31 AS day FROM dual
  ) d
  ON (
       m.month IN (1, 3, 5, 7, 8, 10, 12)
       OR (
            m.month != 2
            AND d.day <= 30
          )
       OR d.day <= 28
       OR (
            d.day = 29
            AND MOD(y.year, 4) = 0
          )
     )
)
ORDER BY workdate;
I get back all of the dates from 1/1/2011 to 12/31/2011.

However, when I replace the ORDER BY with:
WHERE workdate = TO_DATE('01/01/2011', 'MM/DD/YYYY');
I get a "Date Not Valid For Month Specified" (ORA-01839) error.
(The same error happens regardless of the date I use in the WHERE clause.)

If any of the dates in the query were invalid, then the select would have thrown the same error, wouldn't it?

-- Don
This post has been answered by Centinul on Oct 8 2009
Jump to Answer
Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on Nov 5 2009
Added on Oct 8 2009
9 comments
453 views