Firebird - funcoes de data |
Top Previous Next |
//Firebird - Date Functions
//Day of week (American format: week starting on Sunday, Sunday is 0): EXTRACT(WEEKDAY FROM D)
//Day of week (ISO 8601 format: week starting on Monday, Monday is 1): EXTRACT(WEEKDAY FROM D-1)+1
//First day of a month: D - EXTRACT(DAY FROM D) + 1;
//Last day of a month: D - EXTRACT(DAY FROM D) + 33 - EXTRACT(DAY FROM D - EXTRACT(DAY FROM D) + 32)
//Number of days in a month: EXTRACT(DAY FROM (D - EXTRACT(DAY FROM D) + 32 - EXTRACT(DAY FROM D - EXTRACT(DAY FROM D) + 32))
//Week of a year (ISO 8601) stored procedure: CREATE PROCEDURE YearWeek (D DATE) RETURNS (WEEK_NO VARCHAR(8)) AS DECLARE VARIABLE W INTEGER; /* week number */ DECLARE VARIABLE Y INTEGER; /* year the week belongs to */ BEGIN W = (EXTRACT(YEARDAY FROM D) - EXTRACT(WEEKDAY FROM D-1) + 7) / 7; Y = EXTRACT(YEAR FROM D);
IF (W=0) THEN BEGIN Y = Y - 1; D = D - EXTRACT(YEARDAY FROM D) - 1; /* last day of previous year; D is used as temporary variable here */ W = (EXTRACT(YEARDAY FROM D) - EXTRACT(WEEKDAY FROM D-1) + 7) / 7; END ELSE IF (W=53 AND 4>EXTRACT(WEEKDAY FROM (D - EXTRACT(DAY FROM D) + 31))) THEN BEGIN Y = Y + 1; W = 1; END
/* This is just formatting; you may prefer to make W and Y return parameters instead. */ IF (W<10) THEN WEEK_NO = '0'; ELSE WEEK_NO = ''; WEEK_NO = Y '/' WEEK_NO W; SUSPEND; END
//Is leap year stored procedure: CREATE PROCEDURE Is_LeapYear (D DATE) RETURNS (LY INTEGER) AS BEGIN IF ( 2 = EXTRACT(MONTH FROM (D - EXTRACT(YEARDAY FROM D) + 59)) ) THEN LY = 1; /* leap year */ ELSE LY = 0; /* normal year */ END |