Re: Creating Days in a Year - Stored Procedure

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, 23 Feb 2010 14:49:01 -0800, donw@xxxxxxxxxxxxx (Pointmade_Noah1) wrote:

>I found this code below online and I am trying to modify it for my  
>needs. I want to pass a YEAR (Int) to the stored procedure and have it  
>create all the day in that passed year. With one tweak, If the day is  
>Sunday the "sStatus" field will equal "Closed" ELSE "Open". All  
>attempts come up with ERRORS. Also, I would like the sdate field to be  
>a DATE result.  Little help please? I appreciate it.
>
>USE colombo;
>
>-- this table will store dates sequence 
>CREATE TABLE seq_dates
>(
>    sdate DATETIME NOT NULL,
>    sStatus VARCHAR NULL,
>);
>
>DROP PROCEDURE IF EXISTS colombo.sp_init_dates;
>
>CREATE PROCEDURE colombo.sp_init_dates
>(IN p_fdate DATETIME, IN p_tdate DATETIME)
>BEGIN
>DECLARE v_thedate DATETIME;
>DECLARE v_Status VARCHAR;
>
>TRUNCATE TABLE colombo.seq_dates;
>
>SET v_thedate = p_fdate;
>
>WHILE (v_thedate < p_tdate) DO
>
>IF (DayName(v_theDate) = "Sunday" {
>SET v_Status = "Closed";
>}else{
>SET v_Status = "Open";
>}  // I know this CODE is wrong
>
>    -- insert dates squence into seq_dates table
>    INSERT INTO seq_dates (sdate, sStatus)
>    VALUES (v_thedate, v_Status);
>
>    -- go to the next day
>    SET v_thedate = DATE_ADD(v_thedate, INTERVAL 1 DAY);
>
>END WHILE;
>
>END;

You could probably do something cunning with the library functions mktime(), etc, but I
have two functions:

   Abs_day ($date); which converts $date into an absolute day, with 1:1:1800 = day 0
and 

   Ymd ($abs_day); which converts an absolute day back into Y:M:D 

For your purpose there is a lot of redundancy, but between them these functions provide
all the information you have asked for.  Day zero was a Wednesday, so you can readily work
out the DOW for any arbitrary day.

I have tested these functions up to 2500,  but no obvious upper limit).

// Convert date YYYY:MM:DD into absolute day; 1:1:1800 = 0, Wednesday

function abs_day ($u)
	{
	$days = array 
     (0 => array(0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365, 375),
     ( 1 => array(0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366, 375));
				// 0 is normal year, 1 is leap year
	$y = $u[0]; 
	if (($y % 400) == 0) { $ly = 1; }	// See if leap year
	elseif (($y % 100) == 0) { $ly = 0; }
	elseif (($y % 4) == 0) { $ly = 1; }
	else { $ly = 0; }

	$y -= 1800; 
	$c = (int) (($y - 0.99)/100);
	$c = (int) ($c * 0.75 +0.3); // Fiddle factor for centuries (most are not leap
years)
	$abs_day = (int) (($y) * 365.25 - $c - 0.1);
	$d = (int) $u[1];
	$abs_day += $u[2]-1 + $days[$ly][$d];
	return $abs_day;
	}

// Converts abs day to YMD.  

function ymd ($day)
	{
//echo '<h5>Stdu_408: Day = '.$day.'</h5>';
$days = array 
     (0 => array(0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365, 375),
     ( 1 => array(0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366, 375));
	
	$u = false;
	$c = (int)(($day + 0.6)/36524.25);		// No of centuries
	$ly = 0; if ((($c + 2) % 4) == 0) { $ly = 1; }    // See if leap year
	$d0 = $day - (int) ($c * 36524.25 + 0.3); 	// Calculate remaining days
	$yy = (int) (($d0 -$ly + 1.1)/365.25);	// Calculate year
	$d2 = $d0 +1 - (int) ($yy * 365.25 + $ly - 0.125); // & remaining days (again!)
	if ($yy != 0) 
		{
		if (($yy % 4) == 0) { $ly = 1; } else { $ly = 0; } // See if leap year
		}

	$u[0] = 100 * $c + $yy +1800;   		// Calc calendar year
	$i = 1; $j = 0;
	while ($d2 > $days[$ly][$i] && $i < 14) { $i++; }		// and month & day
	$d2 -= $days[$ly][$i-1];
	$u[1] = $i; $u[2] = $d2;
	return $u;
	}

-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php


[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux