the penultimate week and last week of data for each month

S

SimonC

I would like to return data from the last 2 weeks of each given month
in Javascript, but in 2 formats.

So, the penultimate week (Monday to Sunday) and the last week (Monday
to ??)

I'm not sure if it can be done, but all help welcomed.

E.g. I have December and would like to see the last 2 weeks.. So this
doesnt mean the last 15 days. What i mean by this is...

Sometimes a Week will cross over into 2 months, where it finishes on
Tuesday and starts on Wednesday, like November 2004 for example.

With the November 2004 example, means there are 5 weeks in November..
so i would like to see the data within the 4th week (Monday to Sunday)
and the 5th week (Monday to Tuesday). Of course for every month of the
year.
Is this possible??

I look forward to hearing your thoughts.
SimonC
 
M

McKirahan

SimonC said:
I would like to return data from the last 2 weeks of each given month
in Javascript, but in 2 formats.

So, the penultimate week (Monday to Sunday) and the last week (Monday
to ??)

I'm not sure if it can be done, but all help welcomed.

E.g. I have December and would like to see the last 2 weeks.. So this
doesnt mean the last 15 days. What i mean by this is...

Sometimes a Week will cross over into 2 months, where it finishes on
Tuesday and starts on Wednesday, like November 2004 for example.

With the November 2004 example, means there are 5 weeks in November..
so i would like to see the data within the 4th week (Monday to Sunday)
and the 5th week (Monday to Tuesday). Of course for every month of the
year.
Is this possible??

I look forward to hearing your thoughts.
SimonC

Will this help? Watch for word-wrap.

Option Explicit
'*
'* Declare Constants
'*
Const cVBS = "penuweek.vbs"
Const cYER = 2004
'*
'* Declare Variables
'*
Dim arrDAT(12,1)
Dim intDAT
Dim strDAT
Dim intDOW
Dim intMON
Dim strYER
strYER = cYER
'*
'* 12 Months
'*
For intMON = 1 To 12
'*
'* First day of next month
'*
strDAT = DateSerial(strYER,intMON+1,1)
'*
'* Last day of this month
'*
strDAT = DateAdd("d",-1,strDAT)
'*
'* Day of week
'*
intDOW = DatePart("w",strDAT,2)
'*
'* Date of Monday before last
'*
If intDOW = 1 Then intDOW = 8
intDAT = (intDOW + 6) * -1
strDAT = DateAdd("d",intDAT,strDAT)
arrDAT(intMON,0) = strDAT
'*
'* Date of Sunday two weeks later
'*
strDAT = DateAdd("d",13,strDAT)
arrDAT(intMON,1) = strDAT
Next
'*
'* Results
'*
strDAT = ""
For intMON = 1 To 12
strDAT = strDAT & intMON & ". "
strDAT = strDAT & arrDAT(intMON,0) & " : "
strDAT = strDAT & arrDAT(intMON,1) & vbCrLf
Next
MsgBox strDAT,vbInformation,cVBS
 
Z

Zifud

McKirahan said:
I would like to return data from the last 2 weeks of each given month
in Javascript, but in 2 formats.
[...]

Will this help? Watch for word-wrap.

Since this is a JavaScript forum, and the OP has explicitly asked for
JavaScript, why would 'this' help?
Option Explicit
'*
'* Declare Constants
[...]

Perhaps if you re-write it in an appropriate language...
 
M

McKirahan

Zifud said:
McKirahan said:
I would like to return data from the last 2 weeks of each given month
in Javascript, but in 2 formats.
[...]

Will this help? Watch for word-wrap.

Since this is a JavaScript forum, and the OP has explicitly asked for
JavaScript, why would 'this' help?
Option Explicit
'*
'* Declare Constants
[...]

Perhaps if you re-write it in an appropriate language...

The OP did ask "Is this possible??" -- "this" (at least) shows that it is...


You're right, of course. I post to multiple groups and sometimes when I
think of a solution I forget to customize it to the group.
 
M

Mick White

SimonC said:
I would like to return data from the last 2 weeks of each given month
in Javascript, but in 2 formats.

So, the penultimate week (Monday to Sunday) and the last week (Monday
to ??)

I'm not sure if it can be done, but all help welcomed.

E.g. I have December and would like to see the last 2 weeks.. So this
doesnt mean the last 15 days. What i mean by this is...

Sometimes a Week will cross over into 2 months, where it finishes on
Tuesday and starts on Wednesday, like November 2004 for example.

With the November 2004 example, means there are 5 weeks in November..
so i would like to see the data within the 4th week (Monday to Sunday)
and the 5th week (Monday to Tuesday). Of course for every month of the
year.
Is this possible??

I look forward to hearing your thoughts.
SimonC

days=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"];

// Find the Nth day(Three character string,
// e.g "Thu", or use index [Sun=0, Sat=6])
// of the month (full) of a given year (full)
// To find the first Sunday of April 2004:
// var spring = getNthDayInMonth(1,"Sun","April",2004)
// or spring = getNthDayInMonth(1,0,"April",2004)
// returns "4" (April 4th)
function getNthDayInMonth(N,day,month,year){
day=(getIndex(day,days)>-1)? getIndex(day,days):day;
b=getMonthLength(month,year);
d=7*N - 6 + (7+day-getFirstDayOfMonth(month,year))%7
return d<b? d:"error";
}
See http://mickweb.com/javascript/dates/dateFunctions.html for
supporting functions
Mick
 
D

Dr John Stockton

JRS: In article <[email protected]>
, dated Fri, 31 Dec 2004 03:04:46, seen in
SimonC said:
I would like to return data from the last 2 weeks of each given month
in Javascript, but in 2 formats.

Firstly, beware of American solutions; they have funny ideas about dates
over there, and theirs may not be what you want.


FYI, ISO 8601:2000 weeks are ALWAYS Mon=1 to Sun=7. ISO 8601:2000 does
not define week-of-month (ISO 8601:2004 might, though); but there is an
obvious definition by analogy with week-of-year; a week belongs to that
Calendar Month in which its Thursday lies.

So, the penultimate week (Monday to Sunday) and the last week (Monday
to ??)

I'm not sure if it can be done, but all help welcomed.

E.g. I have December and would like to see the last 2 weeks.. So this
doesnt mean the last 15 days. What i mean by this is...

Sometimes a Week will cross over into 2 months, where it finishes on
Tuesday and starts on Wednesday, like November 2004 for example.

With the November 2004 example, means there are 5 weeks in November..
so i would like to see the data within the 4th week (Monday to Sunday)
and the 5th week (Monday to Tuesday). Of course for every month of the
year.

If the last week ends on the last day of the month, and that is not
Sunday, then are you happy about having days in the following month
before the Monday that starts its first full week?

Is this possible??

Yes, but one must first understand it, and maybe believe it.


AFAICS, your last week starts on the last Monday of the month, which is
easily calculated as the zeroth Monday of the following month, or as
0..6 days before the zeroth of that month; and the previous week starts
7 days earlier.

I think the following fits the case; it will show the desired interval
for the first to the 20th months of 2004. Adapt to suit. Test.

for (j=1; j<20; j++) {
X = new Date(2004, j, 0) ; D = new Date(+X) // D is a copy of X
W = D.getDay() // 0..6 Sun-Sat
D.setDate(D.getDate() - (W+6)%7 - 7) // back 0..6 + 7 days
document.writeln(D, ' \t ', X, '<br>')
}

*** *** *** Read the newsgroup FAQ; see below.
 
D

Dr John Stockton

JRS: In article <rLbBd.593649$wV.485877@attbi_s54>, dated Fri, 31 Dec
2004 12:38:47, seen in McKirahan
For intMON = 1 To 12
'*
'* First day of next month
'*
strDAT = DateSerial(strYER,intMON+1,1)
'*
'* Last day of this month
'*
strDAT = DateAdd("d",-1,strDAT)


(a) For the second line, why not just strDat = strDat-1 ??

(b) For both, why not strDAT = DateSerial(strYER, intMON+1, 0) ??


You should learn more about the languages that you use before you
presume to be able to write efficient algorithms; and you should note
that java != VB.
 
S

SimonC

Dr said:
JRS: In article <rLbBd.593649$wV.485877@attbi_s54>, dated Fri, 31 Dec
2004 12:38:47, seen in McKirahan



(a) For the second line, why not just strDat = strDat-1 ??

(b) For both, why not strDAT = DateSerial(strYER, intMON+1, 0) ??


You should learn more about the languages that you use before you
presume to be able to write efficient algorithms; and you should note
that java != VB.

--
© John Stockton, Surrey, UK. [email protected] Turnpike v4.00 MIME. ©
Web <URL:http://www.merlyn.demon.co.uk/> - w. FAQish topics, links, acronyms
PAS EXE etc : <URL:http://www.merlyn.demon.co.uk/programs/> - see 00index.htm
Dates - miscdate.htm moredate.htm js-dates.htm pas-time.htm
critdate.htm etc.

--------------------------------------------------------------------
Thanks guys for all the help. I am starting to understand some of it
more now. As you're probably aware, im no JavaScript expert... Quite
the opposite.

I have tried the scripts posted on here, but they're not quite working
in the way i would like.

I am actually trying to produce this data against a report that i have
written against a Database. The tool is called "Brio" (like Crystal
reports). So i have my columns of data. Now, the data i would like to
get is as described above, but against a column name (field) named as
"NoOfOrders" (this is a date field in the following format: 01/01/2004
00:00:00)

Just as an example of what i have already in the report in terms of
Javascript, below is a simple script i created.
--------
DayNo = new Date(NoOfOrders); weekday=DayNo.getDay()
--------

Again, all help on this would be great and thanks again for the current
input.

Cheers...
SimonC
 
D

Dr John Stockton

JRS: In article <[email protected]>, dated
Fri, 31 Dec 2004 15:53:11, seen in Mick White
days=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"];

// Find the Nth day(Three character string,
// e.g "Thu", or use index [Sun=0, Sat=6])
// of the month (full) of a given year (full)
// To find the first Sunday of April 2004:
// var spring = getNthDayInMonth(1,"Sun","April",2004)
// or spring = getNthDayInMonth(1,0,"April",2004)
// returns "4" (April 4th)
function getNthDayInMonth(N,day,month,year){
day=(getIndex(day,days)>-1)? getIndex(day,days):day;
b=getMonthLength(month,year);
d=7*N - 6 + (7+day-getFirstDayOfMonth(month,year))%7
return d<b? d:"error";
}
See http://mickweb.com/javascript/dates/dateFunctions.html for
supporting functions


For any given month, there is a value of N, 4 or 5, that should select
the very last day; e.g. 2005-01-31 is the Fifth Monday of this month.
But I would expect your b=getMonthLength(month,year) to be 31 for this
month, which the code seems to show as giving an error message for d=31.
Have I misunderstood?

If a Date Object is to be generated from the result, ISTM easier and
safer to confirm that getMonth() is as it should be. For speed, you
could use something like
return ( d < 29 || d <= getMonthLength ) ? d : 0
so that the expensive getMonthLength is only called in a few cases.

In practice, the month-length can only matter for N=5; and, as the
outside world has spotted this, the 5th X-day is rarely called for,
except when specified to mean the last X-day. The latter can easily be
obtained as the zeroth X-day of the following month.

Your function, as shown, pollutes the namespace by stomping on the
previous value of globals b & d.
 
D

Dr John Stockton

JRS: In article <[email protected]>,
dated Mon, 3 Jan 2005 00:56:27, seen in
SimonC said:
Now, the data i would like to
get is as described above, but against a column name (field) named as
"NoOfOrders" (this is a date field in the following format: 01/01/2004
00:00:00)

Not a good example date. Better to choose a date after the 12th of its
month; your example is compatible with each of the customary UK & US
formats. Better still to use, say, 2004/01/17 or 2004-01-17.
Just as an example of what i have already in the report in terms of
Javascript, below is a simple script i created.

If NoOfOrders means anything like Number of Orders, ISTM unlikely
(unless orders are received at exactly one per millisecond, starting at
1970-00-01 00:00:00.001 GMT) that it can be so converted to a reasonable
DayNo. Note that getDay returns 0..6; to get standard ISO/EU/UK day
numbering, that 0 must become a 7.

See below.
 
M

Mick White

Dr said:
For any given month, there is a value of N, 4 or 5, that should select
the very last day; e.g. 2005-01-31 is the Fifth Monday of this month.
But I would expect your b=getMonthLength(month,year) to be 31 for this
month, which the code seems to show as giving an error message for d=31.
Have I misunderstood?

Thanks for the observation, I'll revisit the code, now that I have a few
years of js coding under my belt, I'll optimise the code.
If a Date Object is to be generated from the result, ISTM easier and
safer to confirm that getMonth() is as it should be. For speed, you
could use something like
return ( d < 29 || d <= getMonthLength ) ? d : 0
so that the expensive getMonthLength is only called in a few cases.

A good point, since February is the only non-conformer.

In practice, the month-length can only matter for N=5; and, as the
outside world has spotted this, the 5th X-day is rarely called for,
except when specified to mean the last X-day. The latter can easily be
obtained as the zeroth X-day of the following month.

Another timesaver, I hadn't made this logical leap (N can be only 0-4 or 5)

Your function, as shown, pollutes the namespace by stomping on the
previous value of globals b & d.
Ugly, isn't it?

Thanks.
Mick
 
S

SimonC

Just to confirm.. NoOfOrders is simple a name, that contains dates of
that particular order. I have extrated this field out of a query and i
am using it inside this current one. You're right.. Ugly it is.

The "NoOfOrders" field is in the format of a Date like this:
"31/01/2005 00:00:00"

I assume that the code that is above, i have to call the "NoOfOrders"
field somewhere within the code to apply it!!?!? Sorry about this, but
i really dont know much Javascript.

Cheers...
SimonC
 
D

Dr John Stockton

JRS: In article <[email protected]>
, dated Tue, 4 Jan 2005 02:39:38, seen in
SimonC said:
The "NoOfOrders" field is in the format of a Date like this:
"31/01/2005 00:00:00"

Be warned : javascript is liable, even in the UK, to interpret that date
as being FFF, i.e. MM/DD/YYYY - month 31 day 1 of 2005, 2007-07-01.

See sig below.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,764
Messages
2,569,566
Members
45,041
Latest member
RomeoFarnh

Latest Threads

Top