Plateforme Level Extreme
Abonnement
Profil corporatif
Produits & Services
Support
Légal
English
Birthdays this week
Message
 
 
À
19/03/2009 22:33:25
Dragan Nedeljkovich (En ligne)
Now officially retired
Zrenjanin, Serbia
Information générale
Forum:
Visual FoxPro
Catégorie:
Codage, syntaxe et commandes
Divers
Thread ID:
01389309
Message ID:
01389864
Vues:
42
The table has 823K records.

Your solution is extremelly slow on my table (I interrupted it).

Mine finished in 6.541 sec.
PRIVATE test
lnSeconds = SECONDS()
ldStart = DATE(2008,12,31)
ldEnd = DATE()

lnMonth1 = month(ldStart)
lnDay1 = day(ldStart)

IF YEAR(ldStart) = YEAR(ldEnd)
	lnDiff = ldEnd - ldStart

	select dDOB from Patients where dDOB is not null and dDOB <> {} and dDOB ;
	between date(year(dDOB),lnMonth1,lnDay1) and (date(year(dDOB),lnMonth1,lnDay1) + lnDiff) ;
	ORDER BY dDOB INTO CURSOR curTest nofilter
ELSE
	lnMonth2 = month(ldEnd)
	lnDay2 = day(ldEnd)

   	select dDOB from Patients where dDOB is not null and dDOB <> {} and ;
   	(dDOB between date(year(dDOB),lnMonth1,lnDay1) and date(year(dDOB),12,31) ;
	OR dDOB between date(year(dDOB),1,1) and date(year(dDOB),lnMonth2,lnDay2)) ;
	ORDER BY dDOB INTO CURSOR curTest nofilter
ENDIF
=MESSAGEBOX(SECONDS() - lnSeconds)
lnSeconds = SECONDS() 

ldStart = DATE(2008,12,28)
ldEnd = ldStart+6

lnMonth1 = MONTH(ldStart)
lnDay1 = DAY(ldStart)

lnMonth2 = MONTH(ldEnd)
lnDay2 = DAY(ldEnd)

SYS(3054,12,'test')

IF YEAR(ldStart)=YEAR(ldEnd)
	SELECT DISTINCT YEAR(ddob) AS nYear, {} AS dStart, {} AS dEnd ;
		FROM patients INTO CURSOR crsYears READWRITE WHERE dDOB IS NOT NULL AND dDOB <> {}
		
	REPLACE ALL dStart WITH DATE(nYear, lnMonth1, lnDay1) ;
		,	dEnd WITH DATE(nYear, lnMonth2, lnDay2)

ELSE
	SELECT DISTINCT YEAR(ddob) AS nYear, {} AS dStart, {} AS dEnd ;
		FROM patients INTO CURSOR crsYears1 READWRITE WHERE dDOB IS NOT NULL AND dDOB <> {}
		
	SELECT nYear, DATE(nYear, lnMonth1, lnDay1) AS dStart, DATE(nYear, 12, 31) AS dEnd;
		FROM crsYears1 ;
	UNION SELECT nYear, DATE(nYear, 1, 1) AS dStart, DATE(nYear, lnMonth2, lnDay2) AS dEnd;
		FROM crsYears1 ;
		INTO CURSOR crsYears READWRITE
ENDIF

SELECT ddob FROM patients;
	JOIN crsYears ON BETWEEN(ddob, dStart, dEnd)
=MESSAGEBOX(SECONDS() - lnSeconds)

BROWSE FOR MONTH(dDob) = 2

_cliptext = test
>>Yes, I think I understood myself this as well.
>>
>>We need to write conditional code, unfortunately.
>>
>>If no span, use my code as is
>>
>>If there is a span, use
>>
>>select dDOB from Patients where dDOB is not null and dDOB <> {} and dDOB ;
>>between date(year(dDOB),lnMonth1,lnDay1) and (date(year(dDOB),12,31)  and dDOB between(date(year(DOB),1,1) and date(year(DOB),lnMonth2, lnDay2);
>>ORDER BY dDOB INTO CURSOR curTest nofilter
>
>Here's my unnecessarily complicated solution, just for kicks:
>
>ldStart = DATE(2008,12,28)
>ldEnd = ldStart+6
>
>lnMonth1 = MONTH(ldStart)
>lnDay1 = DAY(ldStart)
>
>lnMonth2 = MONTH(ldEnd)
>lnDay2 = DAY(ldEnd)
>
>IF YEAR(ldStart)=YEAR(ldEnd)
>	SELECT DISTINCT YEAR(ddob) AS nYear, {} AS dStart, {} AS dEnd ;
>		FROM patients INTO CURSOR crsYears READWRITE
>	REPLACE ALL dStart WITH DATE(nYear, lnMonth1, lnDay1);
>		,	dEnd WITH DATE(nYear, lnMonth2, lnDay2)
>
>ELSE
>	SELECT DISTINCT YEAR(ddob) AS nYear, {} AS dStart, {} AS dEnd ;
>		FROM patients INTO CURSOR crsYears1 READWRITE
>	SELECT nYear, DATE(nYear, lnMonth1, lnDay1) AS dStart, DATE(nYear, 12, 31) AS dEnd;
>		FROM crsYears1 ;
>	UNION SELECT nYear, DATE(nYear, 1, 1) AS dStart, DATE(nYear, lnMonth2, lnDay2) AS dEnd;
>		FROM crsYears1 ;
>		INTO CURSOR crsYears READWRITE
>ENDIF
>
>SELECT ddob FROM patients;
>	JOIN crsYears ON BETWEEN(ddob, dStart, dEnd)
>
>
>Tested once each way, worked. It's basically the same as the one with right(dtos(ddob),4) that's been around already, but may come handy if some additional things may be needed for each year (which things, I don't see, but then I'm not standing that high to see far at the moment :).
If it's not broken, fix it until it is.


My Blog
Précédent
Répondre
Fil
Voir

Click here to load this message in the networking platform