Rounding Dates in MySQL 5

by timvasil 2/20/2008 12:19:00 AM

A while back I blogged about how to round dates in SQL Server 2000+.  Here's the MySQL port:

DROP FUNCTION IF EXISTS `dbname`.`fn_RoundDate` $$
CREATE FUNCTION `dbname`.`fn_RoundDate` (dateArg DATETIME, formatArg CHAR) RETURNS DATETIME
DETERMINISTIC
BEGIN

 IF dateArg IS NULL OR formatArg IS NULL THEN
    RETURN NULL;
  ELSEIF formatArg = 'T' THEN -- Time
    RETURN CAST(dateArg AS TIME);
  ELSE
    -- Round to day
    SET dateArg = CAST(dateArg AS DATE);

   RETURN CASE formatArg
    WHEN 'D' THEN -- Day
     CAST(dateArg AS DATE)
    WHEN 'W' THEN -- Week
        ADDDATE(dateArg, INTERVAL 1 - DAYOFWEEK(dateArg) DAY)
    WHEN 'M' THEN -- Month
        ADDDATE(dateArg, INTERVAL 1 - DAYOFMONTH(dateArg) DAY)
      WHEN 'Q' THEN -- Quarter
        ADDDATE(MAKEDATE(YEAR(dateArg), 1), INTERVAL FLOOR(MONTH(dateArg) / 4) QUARTER)
    WHEN 'Y' THEN -- Month
        ADDDATE(dateArg, INTERVAL 1 - DAYOFYEAR(dateArg) DAY)
    ELSE -- Unknown format
     dateArg
    END;
  END IF;

END $$

DELIMITER ;

Why there isn't a built-in function to do something so useful--in either SQL Server or MySQL--is beyond me.

Tags:

MySQL

Comments (2) -

11/10/2009 3:28:35 PM

Leigh Harrison

This would be an immensely useful function - thanks Tim. However, when I try to import it into MySQL 5.1.32 I get the following error.

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '$$
CREATE FUNCTION `myfree`.`fn_RoundDate` (dateArg DATETIME, formatArg CHAR) R' at line 1

Regards,

::Leigh

Leigh Harrison New Zealand

11/10/2009 3:55:27 PM

Leigh Harrison

Aaahhh ... set the delimiter at the start, right?

Thanks,

::Leigh

Leigh Harrison New Zealand

Comments are closed

Search

Calendar

«  February 2012  »
SuMoTuWeThFrSa
2930311234
567891011
12131415161718
19202122232425
26272829123
45678910

View posts in large calendar

Recent comments

Archive