![]() | |
![]() |
| | Thread Tools | Display Modes |
#1
| |||
| |||
|
#2
| |||
| |||
|
|
We datestamp each record in table X with sysdate. In order to query all table X records in the previous month including its last second, I search between the first day of the last and current month. But for reports, I show the end date of the report as the last second of last month because humans think "from 1 to 30" not "between 1 and 31". So what is the standard for these queries? I can to_char the datestamp--but that is very slow--and changing the datestamp's type to varchar2 is not possible nor am I sure desireable. Am I the only one with this question? |
#3
| |||
| |||
|
|
Joe Powell wrote: We datestamp each record in table X with sysdate. In order to query all table X records in the previous month including its last second, I search between the first day of the last and current month. But for reports, I show the end date of the report as the last second of last month because humans think "from 1 to 30" not "between 1 and 31". So what is the standard for these queries? I can to_char the datestamp--but that is very slow--and changing the datestamp's type to varchar2 is not possible nor am I sure desireable. Am I the only one with this question? To get all the records in one month you can say: WHERE a_date BETWEEN TO_DATE('01-Jun-2004','DD-MON-YYYY') AND (TO_DATE('01-Jul-2004','DD-MON-YYYY') - (1/(24 * 60 * 60))) 1/(24 * 60 * 60) = 1 second if you are an oracle DATE column. 24 = hours in day and '60 * 60' = seconds in hour. There is no reason why indexes won't work in this situation and no requirement to use to_char. David Rolfe Orinda Software Dublin, Ireland ------------------------------------------------------------ Orinda Software make OrindaBuild, A Java JDBC Code Generator www.orindasoft.com |
#4
| |||
| |||
|
|
D Rolfe <dwrolfeFRUITBAT (AT) orindasoft (DOT) com> wrote Joe Powell wrote: We datestamp each record in table X with sysdate. In order to query all table X records in the previous month including its last second, I search between the first day of the last and current month. But for reports, I show the end date of the report as the last second of last month because humans think "from 1 to 30" not "between 1 and 31". So what is the standard for these queries? I can to_char the datestamp--but that is very slow--and changing the datestamp's type to varchar2 is not possible nor am I sure desireable. Am I the only one with this question? To get all the records in one month you can say: WHERE a_date BETWEEN TO_DATE('01-Jun-2004','DD-MON-YYYY') AND (TO_DATE('01-Jul-2004','DD-MON-YYYY') - (1/(24 * 60 * 60))) 1/(24 * 60 * 60) = 1 second if you are an oracle DATE column. 24 = hours in day and '60 * 60' = seconds in hour. There is no reason why indexes won't work in this situation and no requirement to use to_char. David Rolfe Orinda Software Dublin, Ireland ------------------------------------------------------------ Orinda Software make OrindaBuild, A Java JDBC Code Generator www.orindasoft.com I would think that you might want to look at the add_month and last_day date functions which would allow you to calculate the previous month from the sysdata and determine the last day of that month. A trunc of the add_months(sysdate, -1) would give you the first day of the prior month. |
#5
| |||
| |||
|
|
We datestamp each record in table X with sysdate. In order to query all table X records in the previous month including its last second, I search between the first day of the last and current month. But for reports, I show the end date of the report as the last second of last month because humans think "from 1 to 30" not "between 1 and 31". So what is the standard for these queries? |
|
I can to_char the datestamp--but that is very slow--and changing the datestamp's type to varchar2 is not possible nor am I sure desireable. |
|
Am I the only one with this question? |
#6
| |||
| |||
|
|
Hello, Joe, near 09:03 30-Jun from joe.powell (AT) lmco (DOT) com accepted: We datestamp each record in table X with sysdate. In order to query all table X records in the previous month including its last second, I search between the first day of the last and current month. But for reports, I show the end date of the report as the last second of last month because humans think "from 1 to 30" not "between 1 and 31". So what is the standard for these queries? There are no "standard" how you can see... The best practicies instead. Assume CREATE TABLE T1(d1 date, n1 number); In order to receive previous month's data I'm using this statement SELECT SUM(n1) FROM T1 WHERE d1 >= trunc(add_months(sysdate,1),'month') ---------------------------------------^ of course: |
|
AND d1 < trunc(sysdate, 'month'); Doing so you can get the data without thinking about measuring precision (second or fraction of it). I can to_char the datestamp--but that is very slow--and changing the datestamp's type to varchar2 is not possible nor am I sure desireable. cast (if you really using timestamp datatype), to_char makes it possible (not desireable of course). Am I the only one with this question? Anyone who makes reports has solved this question, I think. -- wbr, Wit. |
#7
| |||
| |||
|
|
Mark D Powell wrote: D Rolfe <dwrolfeFRUITBAT (AT) orindasoft (DOT) com> wrote Joe Powell wrote: We datestamp each record in table X with sysdate. In order to query all table X records in the previous month including its last second, I search between the first day of the last and current month. But for reports, I show the end date of the report as the last second of last month because humans think "from 1 to 30" not "between 1 and 31". So what is the standard for these queries? I can to_char the datestamp--but that is very slow--and changing the datestamp's type to varchar2 is not possible nor am I sure desireable. Am I the only one with this question? To get all the records in one month you can say: WHERE a_date BETWEEN TO_DATE('01-Jun-2004','DD-MON-YYYY') AND (TO_DATE('01-Jul-2004','DD-MON-YYYY') - (1/(24 * 60 * 60))) 1/(24 * 60 * 60) = 1 second if you are an oracle DATE column. 24 = hours in day and '60 * 60' = seconds in hour. There is no reason why indexes won't work in this situation and no requirement to use to_char. David Rolfe Orinda Software Dublin, Ireland ------------------------------------------------------------ Orinda Software make OrindaBuild, A Java JDBC Code Generator www.orindasoft.com I would think that you might want to look at the add_month and last_day date functions which would allow you to calculate the previous month from the sysdata and determine the last day of that month. A trunc of the add_months(sysdate, -1) would give you the first day of the prior month. I am working on the assumption he wants a month that starts at: 01-Jun-04 00:00:00 and 30-Jun-04 23:59:59 He also mentioned that SYSDATE is used to populate the column, which means the DATE will be accurate to one second. Because the BETWEEN operator is inclusive the search expression needs to allow for the fact that the reporting period ends at 23:59:59. This means that the end date must exclude '01-Jul-04 00:00:00'. This implies working in seconds. You can either: 1. Use an expression that substracts 1 second from the end date 2. Use to_date and '23:59:59' to figure out the exact time the reporting period ends 3. Use BETWEEN and have an additional '<' condition to exclude the first second of the next month. Failure to account for seconds will lead to reports that count transactions at midnight on the first day of a month as being in two seperate months. This can harm your end of year bonus. David Rolfe Orinda Software Dublin, Ireland |
#8
| |||
| |||
|
#9
| |||
| |||
|
|
I get today 30-JUN-04. If there are 10 records in X including 3 from today, why does 'select count(1) from X where datestamp < '01-JUL-04' return 10 but 'select count(1) from X where datestamp <= '30-JUN-04' returns 7? |
#10
| |||
| |||
|
|
Hello, Joe, [...] I get today 30-JUN-04. If there are 10 records in X including 3 from today, why does 'select count(1) from X where datestamp < '01-JUL-04' return 10 but 'select count(1) from X where datestamp <= '30-JUN-04' returns 7? It's simple. Really your first query gets all the JUNE records. The second query gets record with datestamp less than '01-JUN-04 00:00:00' and records with datestamp equal to '01-JUN-2004 00:00:00' (not with 01-JUN-04 with some time portion). Again, '01-JUN-04 14:14:14' is greater than '01-JUN-04'. [...] Be careful with DD-MON-YY. Use DD-MON-RR (or DD-MON-YYYY) instead. -- wbr, Wit. |
![]() |
| Thread Tools | |
| Display Modes | |
| |