funciones de fecha y hora

42
6/12/2014 MySQL :: MySQL 5.0 Reference Manual :: 12.7 Date and Time Functions http://dev.mysql.com/doc/refman/5.0/en/dateandtimefunctions.html 1/42 « 12.6.2 Mathematical Functions 12.8 What Calendar Is Used By MySQL? » Section Navigation [Toggle ] 12 Functions and Operators 12.1 Function and Operator Reference 12.2 Type Conversion in Expression Evaluation 12.3 Operators 12.4 Control Flow Functions 12.5 String Functions 12.6 Numeric Functions and Operators 12.7 Date and Time Functions 12.8 What Calendar Is Used By MySQL? 12.9 FullText Search Functions 12.10 Cast Functions and Operators 12.11 Bit Functions 12.12 Encryption and Compression Functions 12.13 Information Functions 12.14 Spatial Analysis Functions 12.15 Miscellaneous Functions 12.16 Functions and Modifiers for Use with GROUP BY Clauses 12.17 Precision Math MySQL 5.0 Reference Manual :: 12 Functions and Operators :: 12.7 Date and Time Functions 12.7 Date and Time Functions This section describes the functions that can be used to manipulate temporal values. See Section 11.3, “Date and Time Types” , for a description of the range of values each date and time type has and the valid formats in which values may be specified. Table 12.13 Date/Time Functions Name Description ADDDATE() Add time values (intervals) to a date value ADDTIME() Add time CONVERT_TZ() Convert from one timezone to another CURDATE() Return the current date CURRENT_DATE() , CURRENT_DATE Synonyms for CURDATE() CURRENT_TIME() , CURRENT_TIME Synonyms for CURTIME() CURRENT_TIMESTAMP() , CURRENT_TIMESTAMP Synonyms for NOW() CURTIME() Return the current time DATE_ADD() Add time values (intervals) to a date value DATE_FORMAT() Format date as specified DATE_SUB() Subtract a time value (interval) from a date DATE() Extract the date part of a date or datetime expression DATEDIFF() Subtract two dates DAY() Synonym for DAYOFMONTH() DAYNAME() Return the name of the weekday DAYOFMONTH() Return the day of the month (031) DAYOFWEEK() Return the weekday index of the argument DAYOFYEAR() Return the day of the year (1366) EXTRACT() Extract part of a date FROM_DAYS() Convert a day number to a date FROM_UNIXTIME() Format UNIX timestamp as a date GET_FORMAT() Return a date format string HOUR() Extract the hour LAST_DAY Return the last day of the month for the argument LOCALTIME() , LOCALTIME Synonym for NOW() LOCALTIMESTAMP , LOCALTIMESTAMP() Synonym for NOW() MAKEDATE() Create a date from the year and day of year MAKETIME() Create time from hour, minute, second MICROSECOND() Return the microseconds from argument MINUTE() Return the minute from the argument MONTH() Return the month from the date passed MONTHNAME() Return the name of the month NOW() Return the current date and time PERIOD_ADD() Add a period to a yearmonth PERIOD_DIFF() Return the number of months between periods QUARTER() Return the quarter from a date argument SEC_TO_TIME() Converts seconds to 'HH:MM:SS' format SECOND() Return the second (059) STR_TO_DATE() Convert a string to a date SUBDATE() Synonym for DATE_SUB() when invoked with three arguments SUBTIME() Subtract times SYSDATE() Return the time at which the function executes TIME_FORMAT() Format as time TIME_TO_SEC() Return the argument converted to seconds TIME() Extract the time portion of the expression passed TIMEDIFF() Subtract time TIMESTAMP() With a single argument, this function returns the date or datetime expression; with two arguments, the sum of the arguments TIMESTAMPADD() Add an interval to a datetime expression TIMESTAMPDIFF() Subtract an interval from a datetime expression TO_DAYS() Return the date argument converted to days UNIX_TIMESTAMP() Return a UNIX timestamp UTC_DATE() Return the current UTC date UTC_TIME() Return the current UTC time UTC_TIMESTAMP() Return the current UTC date and time WEEK() Return the week number WEEKDAY() Return the weekday index WEEKOFYEAR() Return the calendar week of the date (053) YEAR() Return the year YEARWEEK() Return the year and week Here is an example that uses date functions. The following query selects all rows with a date_col value from within the last 30 days:

Upload: comandosvral

Post on 14-Nov-2015

228 views

Category:

Documents


0 download

DESCRIPTION

Esto es una guia de funciones de fechas para el uso en procedimientos almacenados en postgreSQL

TRANSCRIPT

  • 6/12/2014 MySQL::MySQL5.0ReferenceManual::12.7DateandTimeFunctions

    http://dev.mysql.com/doc/refman/5.0/en/dateandtimefunctions.html 1/42

    12.6.2MathematicalFunctions12.8WhatCalendarIsUsedByMySQL?

    SectionNavigation[Toggle]

    12FunctionsandOperators12.1FunctionandOperatorReference12.2TypeConversioninExpressionEvaluation12.3Operators12.4ControlFlowFunctions12.5StringFunctions12.6NumericFunctionsandOperators12.7DateandTimeFunctions12.8WhatCalendarIsUsedByMySQL?12.9FullTextSearchFunctions12.10CastFunctionsandOperators12.11BitFunctions12.12EncryptionandCompressionFunctions12.13InformationFunctions12.14SpatialAnalysisFunctions12.15MiscellaneousFunctions12.16FunctionsandModifiersforUsewithGROUPBYClauses12.17PrecisionMath

    MySQL5.0ReferenceManual::12FunctionsandOperators::12.7DateandTimeFunctions

    12.7DateandTimeFunctionsThissectiondescribesthefunctionsthatcanbeusedtomanipulatetemporalvalues.SeeSection11.3,DateandTimeTypes,foradescriptionoftherangeofvalueseachdateandtimetypehasandthevalidformatsinwhichvaluesmaybespecified.

    Table12.13Date/TimeFunctions

    Name DescriptionADDDATE() Addtimevalues(intervals)toadatevalueADDTIME() AddtimeCONVERT_TZ() ConvertfromonetimezonetoanotherCURDATE() ReturnthecurrentdateCURRENT_DATE(),CURRENT_DATE

    SynonymsforCURDATE()

    CURRENT_TIME(),CURRENT_TIME

    SynonymsforCURTIME()

    CURRENT_TIMESTAMP(),CURRENT_TIMESTAMP

    SynonymsforNOW()

    CURTIME() ReturnthecurrenttimeDATE_ADD() Addtimevalues(intervals)toadatevalueDATE_FORMAT() FormatdateasspecifiedDATE_SUB() Subtractatimevalue(interval)fromadateDATE() ExtractthedatepartofadateordatetimeexpressionDATEDIFF() SubtracttwodatesDAY() SynonymforDAYOFMONTH()DAYNAME() ReturnthenameoftheweekdayDAYOFMONTH() Returnthedayofthemonth(031)DAYOFWEEK() ReturntheweekdayindexoftheargumentDAYOFYEAR() Returnthedayoftheyear(1366)EXTRACT() ExtractpartofadateFROM_DAYS() ConvertadaynumbertoadateFROM_UNIXTIME() FormatUNIXtimestampasadateGET_FORMAT() ReturnadateformatstringHOUR() ExtractthehourLAST_DAY ReturnthelastdayofthemonthfortheargumentLOCALTIME(),LOCALTIME SynonymforNOW()LOCALTIMESTAMP,LOCALTIMESTAMP()

    SynonymforNOW()

    MAKEDATE() CreateadatefromtheyearanddayofyearMAKETIME() Createtimefromhour,minute,secondMICROSECOND() ReturnthemicrosecondsfromargumentMINUTE() ReturntheminutefromtheargumentMONTH() ReturnthemonthfromthedatepassedMONTHNAME() ReturnthenameofthemonthNOW() ReturnthecurrentdateandtimePERIOD_ADD() AddaperiodtoayearmonthPERIOD_DIFF() ReturnthenumberofmonthsbetweenperiodsQUARTER() ReturnthequarterfromadateargumentSEC_TO_TIME() Convertssecondsto'HH:MM:SS'formatSECOND() Returnthesecond(059)STR_TO_DATE() ConvertastringtoadateSUBDATE() SynonymforDATE_SUB()wheninvokedwiththreeargumentsSUBTIME() SubtracttimesSYSDATE() ReturnthetimeatwhichthefunctionexecutesTIME_FORMAT() FormatastimeTIME_TO_SEC() ReturntheargumentconvertedtosecondsTIME() ExtractthetimeportionoftheexpressionpassedTIMEDIFF() SubtracttimeTIMESTAMP() Withasingleargument,thisfunctionreturnsthedateordatetimeexpression

    withtwoarguments,thesumoftheargumentsTIMESTAMPADD() AddanintervaltoadatetimeexpressionTIMESTAMPDIFF() SubtractanintervalfromadatetimeexpressionTO_DAYS() ReturnthedateargumentconvertedtodaysUNIX_TIMESTAMP() ReturnaUNIXtimestampUTC_DATE() ReturnthecurrentUTCdateUTC_TIME() ReturnthecurrentUTCtimeUTC_TIMESTAMP() ReturnthecurrentUTCdateandtimeWEEK() ReturntheweeknumberWEEKDAY() ReturntheweekdayindexWEEKOFYEAR() Returnthecalendarweekofthedate(053)YEAR() ReturntheyearYEARWEEK() Returntheyearandweek

    Hereisanexamplethatusesdatefunctions.Thefollowingqueryselectsallrowswithadate_colvaluefromwithinthelast30days:

  • 6/12/2014 MySQL::MySQL5.0ReferenceManual::12.7DateandTimeFunctions

    http://dev.mysql.com/doc/refman/5.0/en/dateandtimefunctions.html 2/42

    mysql>SELECTsomethingFROMtbl_name

    >WHEREDATE_SUB(CURDATE(),INTERVAL30DAY)

  • 6/12/2014 MySQL::MySQL5.0ReferenceManual::12.7DateandTimeFunctions

    http://dev.mysql.com/doc/refman/5.0/en/dateandtimefunctions.html 3/42

    >'20080613'

    mysql>SELECTCURDATE()+0

    >20080613

    CURRENT_DATE,CURRENT_DATE()

    CURRENT_DATEandCURRENT_DATE()aresynonymsforCURDATE().

    CURRENT_TIME,CURRENT_TIME()

    CURRENT_TIMEandCURRENT_TIME()aresynonymsforCURTIME().

    CURRENT_TIMESTAMP,CURRENT_TIMESTAMP()

    CURRENT_TIMESTAMPandCURRENT_TIMESTAMP()aresynonymsforNOW().

    CURTIME()

    Returnsthecurrenttimeasavaluein'HH:MM:SS'orHHMMSS.uuuuuuformat,dependingonwhetherthefunctionisusedinastringornumericcontext.Thevalueisexpressedinthecurrenttimezone.

    mysql>SELECTCURTIME()

    >'23:50:26'

    mysql>SELECTCURTIME()+0

    >235026.000000

    DATE(expr)

    Extractsthedatepartofthedateordatetimeexpressionexpr.

    mysql>SELECTDATE('2003123101:02:03')

    >'20031231'

    DATEDIFF(expr1,expr2)

    DATEDIFF()returnsexpr1expr2expressedasavalueindaysfromonedatetotheother.expr1andexpr2aredateordateandtimeexpressions.Onlythedatepartsofthevaluesareusedinthecalculation.

    mysql>SELECTDATEDIFF('2007123123:59:59','20071230')

    >1

    mysql>SELECTDATEDIFF('2010113023:59:59','20101231')

    >31

    DATE_ADD(date,INTERVALexprunit),DATE_SUB(date,INTERVALexprunit)

    Thesefunctionsperformdatearithmetic.Thedateargumentspecifiesthestartingdateordatetimevalue.exprisanexpressionspecifyingtheintervalvaluetobeaddedorsubtractedfromthestartingdate.exprisastringitmaystartwithafornegativeintervals.unitisakeywordindicatingtheunitsinwhichtheexpressionshouldbeinterpreted.

    TheINTERVALkeywordandtheunitspecifierarenotcasesensitive.

    Thefollowingtableshowstheexpectedformoftheexprargumentforeachunitvalue.

    unitValue ExpectedexprFormatMICROSECOND MICROSECONDS

    SECOND SECONDS

    MINUTE MINUTES

    HOUR HOURS

    DAY DAYS

    WEEK WEEKS

    MONTH MONTHS

    QUARTER QUARTERS

    YEAR YEARS

    SECOND_MICROSECOND 'SECONDS.MICROSECONDS'

    MINUTE_MICROSECOND 'MINUTES:SECONDS.MICROSECONDS'

    MINUTE_SECOND 'MINUTES:SECONDS'

    HOUR_MICROSECOND 'HOURS:MINUTES:SECONDS.MICROSECONDS'

    HOUR_SECOND 'HOURS:MINUTES:SECONDS'

    HOUR_MINUTE 'HOURS:MINUTES'

    DAY_MICROSECOND 'DAYSHOURS:MINUTES:SECONDS.MICROSECONDS'

    DAY_SECOND 'DAYSHOURS:MINUTES:SECONDS'

    DAY_MINUTE 'DAYSHOURS:MINUTES'

    DAY_HOUR 'DAYSHOURS'

    YEAR_MONTH 'YEARSMONTHS'

    Thereturnvaluedependsonthearguments:

    DATETIMEifthefirstargumentisaDATETIME(orTIMESTAMP)value,orifthefirstargumentisaDATEandtheunitvalueusesHOURS,MINUTES,orSECONDS.

    Stringotherwise.

    ToensurethattheresultisDATETIME,youcanuseCAST()toconvertthefirstargumenttoDATETIME.

  • 6/12/2014 MySQL::MySQL5.0ReferenceManual::12.7DateandTimeFunctions

    http://dev.mysql.com/doc/refman/5.0/en/dateandtimefunctions.html 4/42

    MySQLpermitsanypunctuationdelimiterintheexprformat.Thoseshowninthetablearethesuggesteddelimiters.IfthedateargumentisaDATEvalueandyourcalculationsinvolveonlyYEAR,MONTH,andDAYparts(thatis,notimeparts),theresultisaDATEvalue.Otherwise,theresultisaDATETIMEvalue.

    DatearithmeticalsocanbeperformedusingINTERVALtogetherwiththe+oroperator:

    date+INTERVALexprunit

    dateINTERVALexprunit

    INTERVALexprunit ispermittedoneithersideofthe+operatoriftheexpressionontheothersideisadateordatetimevalue.Fortheoperator,INTERVALexprunit ispermittedonlyontherightside,becauseitmakesnosensetosubtractadateordatetimevaluefromaninterval.

    mysql>SELECT'2008123123:59:59'+INTERVAL1SECOND

    >'2009010100:00:00'

    mysql>SELECTINTERVAL1DAY+'20081231'

    >'20090101'

    mysql>SELECT'20050101'INTERVAL1SECOND

    >'2004123123:59:59'

    mysql>SELECTDATE_ADD('2000123123:59:59',

    >INTERVAL1SECOND)

    >'2001010100:00:00'

    mysql>SELECTDATE_ADD('2010123123:59:59',

    >INTERVAL1DAY)

    >'2011010123:59:59'

    mysql>SELECTDATE_ADD('2100123123:59:59',

    >INTERVAL'1:1'MINUTE_SECOND)

    >'2101010100:01:00'

    mysql>SELECTDATE_SUB('2005010100:00:00',

    >INTERVAL'11:1:1'DAY_SECOND)

    >'2004123022:58:59'

    mysql>SELECTDATE_ADD('1900010100:00:00',

    >INTERVAL'110'DAY_HOUR)

    >'1899123014:00:00'

    mysql>SELECTDATE_SUB('19980102',INTERVAL31DAY)

    >'19971202'

    mysql>SELECTDATE_ADD('1992123123:59:59.000002',

    >INTERVAL'1.999999'SECOND_MICROSECOND)

    >'1993010100:00:01.000001'

    Ifyouspecifyanintervalvaluethatistooshort(doesnotincludealltheintervalpartsthatwouldbeexpectedfromtheunitkeyword),MySQLassumesthatyouhaveleftouttheleftmostpartsoftheintervalvalue.Forexample,ifyouspecifyaunitofDAY_SECOND,thevalueofexprisexpectedtohavedays,hours,minutes,andsecondsparts.Ifyouspecifyavaluelike'1:10',MySQLassumesthatthedaysandhourspartsaremissingandthevaluerepresentsminutesandseconds.Inotherwords,'1:10'DAY_SECONDisinterpretedinsuchawaythatitisequivalentto'1:10'MINUTE_SECOND.ThisisanalogoustothewaythatMySQLinterpretsTIMEvaluesasrepresentingelapsedtimeratherthanasatimeofday.

    Becauseexpristreatedasastring,becarefulifyouspecifyanonstringvaluewithINTERVAL.Forexample,withanintervalspecifierofHOUR_MINUTE,6/4evaluatesto1.5000andistreatedas1hour,5000minutes:

    mysql>SELECT6/4

    >1.5000

    mysql>SELECTDATE_ADD('20090101',INTERVAL6/4HOUR_MINUTE)

    >'2009010412:20:00'

    Toensureinterpretationoftheintervalvalueasyouexpect,aCAST()operationmaybeused.Totreat6/4as1hour,5minutes,castittoaDECIMALvaluewithasinglefractionaldigit:

    mysql>SELECTCAST(6/4ASDECIMAL(3,1))

    >1.5

    mysql>SELECTDATE_ADD('1970010112:00:00',

    >INTERVALCAST(6/4ASDECIMAL(3,1))HOUR_MINUTE)

    >'1970010113:05:00'

    Ifyouaddtoorsubtractfromadatevaluesomethingthatcontainsatimepart,theresultisautomaticallyconvertedtoadatetimevalue:

    mysql>SELECTDATE_ADD('20130101',INTERVAL1DAY)

    >'20130102'

    mysql>SELECTDATE_ADD('20130101',INTERVAL1HOUR)

    >'2013010101:00:00'

    IfyouaddMONTH,YEAR_MONTH,orYEARandtheresultingdatehasadaythatislargerthanthemaximumdayforthenewmonth,thedayisadjustedtothemaximumdaysinthenewmonth:

    mysql>SELECTDATE_ADD('20090130',INTERVAL1MONTH)

    >'20090228'

    Datearithmeticoperationsrequirecompletedatesanddonotworkwithincompletedatessuchas'20060700'orbadlymalformeddates:

    mysql>SELECTDATE_ADD('20060700',INTERVAL1DAY)

  • 6/12/2014 MySQL::MySQL5.0ReferenceManual::12.7DateandTimeFunctions

    http://dev.mysql.com/doc/refman/5.0/en/dateandtimefunctions.html 5/42

    >NULL

    mysql>SELECT'20050332'+INTERVAL1MONTH

    >NULL

    DATE_FORMAT(date,format)

    Formatsthedatevalueaccordingtotheformatstring.

    Thefollowingspecifiersmaybeusedintheformatstring.The%characterisrequiredbeforeformatspecifiercharacters.

    Specifier Description%a Abbreviatedweekdayname(Sun..Sat)%b Abbreviatedmonthname(Jan..Dec)%c Month,numeric(0..12)%D DayofthemonthwithEnglishsuffix(0th,1st,2nd,3rd,)%d Dayofthemonth,numeric(00..31)%e Dayofthemonth,numeric(0..31)%f Microseconds(000000..999999)%H Hour(00..23)%h Hour(01..12)%I Hour(01..12)%i Minutes,numeric(00..59)%j Dayofyear(001..366)%k Hour(0..23)%l Hour(1..12)%M Monthname(January..December)%m Month,numeric(00..12)%p AMorPM%r Time,12hour(hh:mm:ssfollowedbyAMorPM)%S Seconds(00..59)%s Seconds(00..59)%T Time,24hour(hh:mm:ss)%U Week(00..53),whereSundayisthefirstdayoftheweekWEEK()mode0%u Week(00..53),whereMondayisthefirstdayoftheweekWEEK()mode1%V Week(01..53),whereSundayisthefirstdayoftheweekWEEK()mode2usedwith%X%v Week(01..53),whereMondayisthefirstdayoftheweekWEEK()mode3usedwith%x%W Weekdayname(Sunday..Saturday)%w Dayoftheweek(0=Sunday..6=Saturday)%X YearfortheweekwhereSundayisthefirstdayoftheweek,numeric,fourdigitsusedwith%V%x Yearfortheweek,whereMondayisthefirstdayoftheweek,numeric,fourdigitsusedwith%v%Y Year,numeric,fourdigits%y Year,numeric(twodigits)%% Aliteral%character%x x ,foranyx notlistedabove

    RangesforthemonthanddayspecifiersbeginwithzeroduetothefactthatMySQLpermitsthestoringofincompletedatessuchas'20140000'.

    AsofMySQL5.0.25,thelanguageusedfordayandmonthnamesandabbreviationsiscontrolledbythevalueofthelc_time_namessystemvariable(Section10.7,MySQLServerLocaleSupport).

    Forthe%U,%u,%V,and%vspecifiers,seethedescriptionoftheWEEK()functionforinformationaboutthemodevalues.Themodeaffectshowweeknumberingoccurs.

    AsofMySQL5.0.36,DATE_FORMAT()returnsastringwithacharactersetandcollationgivenbycharacter_set_connectionandcollation_connectionsothatitcanreturnmonthandweekdaynamescontainingnonASCIIcharacters.Before5.0.36,thereturnvalueisabinarystring.

    mysql>SELECTDATE_FORMAT('2009100422:23:00','%W%M%Y')

    >'SundayOctober2009'

    mysql>SELECTDATE_FORMAT('2007100422:23:00','%H:%i:%s')

    >'22:23:00'

    mysql>SELECTDATE_FORMAT('1900100422:23:00',

    >'%D%y%a%d%m%b%j')

    >'4th00Thu0410Oct277'

    mysql>SELECTDATE_FORMAT('1997100422:23:00',

    >'%H%k%I%r%T%S%w')

    >'22221010:23:00PM22:23:00006'

    mysql>SELECTDATE_FORMAT('19990101','%X%V')

    >'199852'

    mysql>SELECTDATE_FORMAT('20060600','%d')

    >'00'

    DATE_SUB(date,INTERVALexprunit)

    SeethedescriptionforDATE_ADD().

    DAY(date)

    DAY()isasynonymforDAYOFMONTH().

  • 6/12/2014 MySQL::MySQL5.0ReferenceManual::12.7DateandTimeFunctions

    http://dev.mysql.com/doc/refman/5.0/en/dateandtimefunctions.html 6/42

    DAYNAME(date)

    Returnsthenameoftheweekdayfordate.AsofMySQL5.0.25,thelanguageusedforthenameiscontrolledbythevalueofthelc_time_namessystemvariable(Section10.7,MySQLServerLocaleSupport).

    mysql>SELECTDAYNAME('20070203')

    >'Saturday'

    DAYOFMONTH(date)

    Returnsthedayofthemonthfordate,intherange1to31,or0fordatessuchas'00000000'or'20080000'thathaveazerodaypart.

    mysql>SELECTDAYOFMONTH('20070203')

    >3

    DAYOFWEEK(date)

    Returnstheweekdayindexfordate(1=Sunday,2=Monday,,7=Saturday).TheseindexvaluescorrespondtotheODBCstandard.

    mysql>SELECTDAYOFWEEK('20070203')

    >7

    DAYOFYEAR(date)

    Returnsthedayoftheyearfordate,intherange1to366.

    mysql>SELECTDAYOFYEAR('20070203')

    >34

    EXTRACT(unitFROMdate)

    TheEXTRACT()functionusesthesamekindsofunitspecifiersasDATE_ADD()orDATE_SUB(),butextractspartsfromthedateratherthanperformingdatearithmetic.

    mysql>SELECTEXTRACT(YEARFROM'20090702')

    >2009

    mysql>SELECTEXTRACT(YEAR_MONTHFROM'2009070201:02:03')

    >200907

    mysql>SELECTEXTRACT(DAY_MINUTEFROM'2009070201:02:03')

    >20102

    mysql>SELECTEXTRACT(MICROSECOND

    >FROM'2003010210:30:00.000123')

    >123

    FROM_DAYS(N)

    GivenadaynumberN,returnsaDATEvalue.

    mysql>SELECTFROM_DAYS(730669)

    >'20070703'

    UseFROM_DAYS()withcautiononolddates.ItisnotintendedforusewithvaluesthatprecedetheadventoftheGregoriancalendar(1582).SeeSection12.8,WhatCalendarIsUsedByMySQL?.

    FROM_UNIXTIME(unix_timestamp),FROM_UNIXTIME(unix_timestamp,format)

    Returnsarepresentationoftheunix_timestampargumentasavaluein'YYYYMMDDHH:MM:SS'orYYYYMMDDHHMMSS.uuuuuuformat,dependingonwhetherthefunctionisusedinastringornumericcontext.Thevalueisexpressedinthecurrenttimezone.unix_timestampisaninternaltimestampvaluesuchasisproducedbytheUNIX_TIMESTAMP()function.

    Ifformatisgiven,theresultisformattedaccordingtotheformatstring,whichisusedthesamewayaslistedintheentryfortheDATE_FORMAT()function.

    mysql>SELECTFROM_UNIXTIME(1196440219)

    >'2007113010:30:19'

    mysql>SELECTFROM_UNIXTIME(1196440219)+0

    >20071130103019.000000

    mysql>SELECTFROM_UNIXTIME(UNIX_TIMESTAMP(),

    >'%Y%D%M%h:%i:%s%x')

    >'200730thNovember10:30:592007'

    Note:IfyouuseUNIX_TIMESTAMP()andFROM_UNIXTIME()toconvertbetweenTIMESTAMPvaluesandUnixtimestampvalues,theconversionislossybecausethemappingisnotonetooneinbothdirections.Fordetails,seethedescriptionoftheUNIX_TIMESTAMP()function.

    GET_FORMAT({DATE|TIME|DATETIME},{'EUR'|'USA'|'JIS'|'ISO'|'INTERNAL'})

    Returnsaformatstring.ThisfunctionisusefulincombinationwiththeDATE_FORMAT()andtheSTR_TO_DATE()functions.

    Thepossiblevaluesforthefirstandsecondargumentsresultinseveralpossibleformatstrings(forthespecifiersused,seethetableintheDATE_FORMAT()functiondescription).ISOformatreferstoISO9075,notISO8601.

    FunctionCall Result

  • 6/12/2014 MySQL::MySQL5.0ReferenceManual::12.7DateandTimeFunctions

    http://dev.mysql.com/doc/refman/5.0/en/dateandtimefunctions.html 7/42

    GET_FORMAT(DATE,'USA') '%m.%d.%Y'

    GET_FORMAT(DATE,'JIS') '%Y%m%d'

    GET_FORMAT(DATE,'ISO') '%Y%m%d'

    GET_FORMAT(DATE,'EUR') '%d.%m.%Y'

    GET_FORMAT(DATE,'INTERNAL') '%Y%m%d'

    GET_FORMAT(DATETIME,'USA') '%Y%m%d%H.%i.%s'

    GET_FORMAT(DATETIME,'JIS') '%Y%m%d%H:%i:%s'

    GET_FORMAT(DATETIME,'ISO') '%Y%m%d%H:%i:%s'

    GET_FORMAT(DATETIME,'EUR') '%Y%m%d%H.%i.%s'

    GET_FORMAT(DATETIME,'INTERNAL') '%Y%m%d%H%i%s'

    GET_FORMAT(TIME,'USA') '%h:%i:%s%p'

    GET_FORMAT(TIME,'JIS') '%H:%i:%s'

    GET_FORMAT(TIME,'ISO') '%H:%i:%s'

    GET_FORMAT(TIME,'EUR') '%H.%i.%s'

    GET_FORMAT(TIME,'INTERNAL') '%H%i%s'

    TIMESTAMPcanalsobeusedasthefirstargumenttoGET_FORMAT(),inwhichcasethefunctionreturnsthesamevaluesasforDATETIME.

    mysql>SELECTDATE_FORMAT('20031003',GET_FORMAT(DATE,'EUR'))

    >'03.10.2003'

    mysql>SELECTSTR_TO_DATE('10.31.2003',GET_FORMAT(DATE,'USA'))

    >'20031031'

    HOUR(time)

    Returnsthehourfortime.Therangeofthereturnvalueis0to23fortimeofdayvalues.However,therangeofTIMEvaluesactuallyismuchlarger,soHOURcanreturnvaluesgreaterthan23.

    mysql>SELECTHOUR('10:05:03')

    >10

    mysql>SELECTHOUR('272:59:59')

    >272

    LAST_DAY(date)

    Takesadateordatetimevalueandreturnsthecorrespondingvalueforthelastdayofthemonth.ReturnsNULLiftheargumentisinvalid.

    mysql>SELECTLAST_DAY('20030205')

    >'20030228'

    mysql>SELECTLAST_DAY('20040205')

    >'20040229'

    mysql>SELECTLAST_DAY('2004010101:01:01')

    >'20040131'

    mysql>SELECTLAST_DAY('20030332')

    >NULL

    LOCALTIME,LOCALTIME()

    LOCALTIMEandLOCALTIME()aresynonymsforNOW().

    LOCALTIMESTAMP,LOCALTIMESTAMP()

    LOCALTIMESTAMPandLOCALTIMESTAMP()aresynonymsforNOW().

    MAKEDATE(year,dayofyear)

    Returnsadate,givenyearanddayofyearvalues.dayofyearmustbegreaterthan0ortheresultisNULL.

    mysql>SELECTMAKEDATE(2011,31),MAKEDATE(2011,32)

    >'20110131','20110201'

    mysql>SELECTMAKEDATE(2011,365),MAKEDATE(2014,365)

    >'20111231','20141231'

    mysql>SELECTMAKEDATE(2011,0)

    >NULL

    MAKETIME(hour,minute,second)

    Returnsatimevaluecalculatedfromthehour,minute,andsecondarguments.

    mysql>SELECTMAKETIME(12,15,30)

    >'12:15:30'

    MICROSECOND(expr)

    Returnsthemicrosecondsfromthetimeordatetimeexpressionexprasanumberintherangefrom0to999999.

    mysql>SELECTMICROSECOND('12:00:00.123456')

    >123456

    mysql>SELECTMICROSECOND('2009123123:59:59.000010')

    >10

  • 6/12/2014 MySQL::MySQL5.0ReferenceManual::12.7DateandTimeFunctions

    http://dev.mysql.com/doc/refman/5.0/en/dateandtimefunctions.html 8/42

    MINUTE(time)

    Returnstheminutefortime,intherange0to59.

    mysql>SELECTMINUTE('2008020310:05:03')

    >5

    MONTH(date)

    Returnsthemonthfordate,intherange1to12forJanuarytoDecember,or0fordatessuchas'00000000'or'20080000'thathaveazeromonthpart.

    mysql>SELECTMONTH('20080203')

    >2

    MONTHNAME(date)

    Returnsthefullnameofthemonthfordate.AsofMySQL5.0.25,thelanguageusedforthenameiscontrolledbythevalueofthelc_time_namessystemvariable(Section10.7,MySQLServerLocaleSupport).

    mysql>SELECTMONTHNAME('20080203')

    >'February'

    NOW()

    Returnsthecurrentdateandtimeasavaluein'YYYYMMDDHH:MM:SS'orYYYYMMDDHHMMSS.uuuuuuformat,dependingonwhetherthefunctionisusedinastringornumericcontext.Thevalueisexpressedinthecurrenttimezone.

    mysql>SELECTNOW()

    >'2007121523:50:26'

    mysql>SELECTNOW()+0

    >20071215235026.000000

    NOW()returnsaconstanttimethatindicatesthetimeatwhichthestatementbegantoexecute.(Withinastoredfunctionortrigger,NOW()returnsthetimeatwhichthefunctionortriggeringstatementbegantoexecute.)ThisdiffersfromthebehaviorforSYSDATE(),whichreturnstheexacttimeatwhichitexecutesasofMySQL5.0.12.

    mysql>SELECTNOW(),SLEEP(2),NOW()

    ++++

    |NOW()|SLEEP(2)|NOW()|

    ++++

    |2006041213:47:36|0|2006041213:47:36|

    ++++

    mysql>SELECTSYSDATE(),SLEEP(2),SYSDATE()

    ++++

    |SYSDATE()|SLEEP(2)|SYSDATE()|

    ++++

    |2006041213:47:44|0|2006041213:47:46|

    ++++

    Inaddition,theSETTIMESTAMPstatementaffectsthevaluereturnedbyNOW()butnotbySYSDATE().ThismeansthattimestampsettingsinthebinaryloghavenoeffectoninvocationsofSYSDATE().SettingthetimestamptoanonzerovaluecauseseachsubsequentinvocationofNOW()toreturnthatvalue.SettingthetimestamptozerocancelsthiseffectsothatNOW()onceagainreturnsthecurrentdateandtime.

    SeethedescriptionforSYSDATE()foradditionalinformationaboutthedifferencesbetweenthetwofunctions.

    PERIOD_ADD(P,N)

    AddsNmonthstoperiodP(intheformatYYMMorYYYYMM).ReturnsavalueintheformatYYYYMM.NotethattheperiodargumentPisnotadatevalue.

    mysql>SELECTPERIOD_ADD(200801,2)

    >200803

    PERIOD_DIFF(P1,P2)

    ReturnsthenumberofmonthsbetweenperiodsP1andP2.P1andP2shouldbeintheformatYYMMorYYYYMM.NotethattheperiodargumentsP1andP2arenotdatevalues.

    mysql>SELECTPERIOD_DIFF(200802,200703)

    >11

    QUARTER(date)

    Returnsthequarteroftheyearfordate,intherange1to4.

    mysql>SELECTQUARTER('20080401')

    >2

    SECOND(time)

    Returnsthesecondfortime,intherange0to59.

    mysql>SELECTSECOND('10:05:03')

  • 6/12/2014 MySQL::MySQL5.0ReferenceManual::12.7DateandTimeFunctions

    http://dev.mysql.com/doc/refman/5.0/en/dateandtimefunctions.html 9/42

    >3

    SEC_TO_TIME(seconds)

    Returnsthesecondsargument,convertedtohours,minutes,andseconds,asaTIMEvalue.TherangeoftheresultisconstrainedtothatoftheTIMEdatatype.Awarningoccursiftheargumentcorrespondstoavalueoutsidethatrange.

    mysql>SELECTSEC_TO_TIME(2378)

    >'00:39:38'

    mysql>SELECTSEC_TO_TIME(2378)+0

    >3938

    STR_TO_DATE(str,format)

    ThisistheinverseoftheDATE_FORMAT()function.Ittakesastringstrandaformatstringformat.STR_TO_DATE()returnsaDATETIMEvalueiftheformatstringcontainsbothdateandtimeparts,oraDATEorTIMEvalueifthestringcontainsonlydateortimeparts.Ifthedate,time,ordatetimevalueextractedfromstrisillegal,STR_TO_DATE()returnsNULLand,asofMySQL5.0.3,producesawarning.

    Theserverscansstrattemptingtomatchformattoit.Theformatstringcancontainliteralcharactersandformatspecifiersbeginningwith%.Literalcharactersinformatmustmatchliterallyinstr.Formatspecifiersinformatmustmatchadateortimepartinstr.Forthespecifiersthatcanbeusedinformat,seetheDATE_FORMAT()functiondescription.

    mysql>SELECTSTR_TO_DATE('01,5,2013','%d,%m,%Y')

    >'20130501'

    mysql>SELECTSTR_TO_DATE('May1,2013','%M%d,%Y')

    >'20130501'

    Scanningstartsatthebeginningofstrandfailsifformatisfoundnottomatch.Extracharactersattheendofstrareignored.

    mysql>SELECTSTR_TO_DATE('a09:30:17','a%h:%i:%s')

    >'09:30:17'

    mysql>SELECTSTR_TO_DATE('a09:30:17','%h:%i:%s')

    >NULL

    mysql>SELECTSTR_TO_DATE('09:30:17a','%h:%i:%s')

    >'09:30:17'

    Unspecifieddateortimepartshaveavalueof0,soincompletelyspecifiedvaluesinstrproducearesultwithsomeorallpartssetto0:

    mysql>SELECTSTR_TO_DATE('abc','abc')

    >'00000000'

    mysql>SELECTSTR_TO_DATE('9','%m')

    >'00000900'

    mysql>SELECTSTR_TO_DATE('9','%s')

    >'00:00:09'

    RangecheckingonthepartsofdatevaluesisasdescribedinSection11.3.1,TheDATE,DATETIME,andTIMESTAMPTypes.Thismeans,forexample,thatzerodatesordateswithpartvaluesof0arepermittedunlesstheSQLmodeissettodisallowsuchvalues.

    mysql>SELECTSTR_TO_DATE('00/00/0000','%m/%d/%Y')

    >'00000000'

    mysql>SELECTSTR_TO_DATE('04/31/2004','%m/%d/%Y')

    >'20040431'

    Note

    Youcannotuseformat"%X%V"toconvertayearweekstringtoadatebecausethecombinationofayearandweekdoesnotuniquelyidentifyayearandmonthiftheweekcrossesamonthboundary.Toconvertayearweektoadate,youshouldalsospecifytheweekday:

    mysql>SELECTSTR_TO_DATE('200442Monday','%X%V%W')

    >'20041018'

    SUBDATE(date,INTERVALexprunit),SUBDATE(expr,days)

    WheninvokedwiththeINTERVALformofthesecondargument,SUBDATE()isasynonymforDATE_SUB().ForinformationontheINTERVALunitargument,seethediscussionforDATE_ADD().

    mysql>SELECTDATE_SUB('20080102',INTERVAL31DAY)

    >'20071202'

    mysql>SELECTSUBDATE('20080102',INTERVAL31DAY)

    >'20071202'

    Thesecondformenablestheuseofanintegervaluefordays.Insuchcases,itisinterpretedasthenumberofdaystobesubtractedfromthedateordatetimeexpressionexpr.

    mysql>SELECTSUBDATE('2008010212:00:00',31)

    >'2007120212:00:00'

    SUBTIME(expr1,expr2)

  • 6/12/2014 MySQL::MySQL5.0ReferenceManual::12.7DateandTimeFunctions

    http://dev.mysql.com/doc/refman/5.0/en/dateandtimefunctions.html 10/42

    SUBTIME()returnsexpr1expr2expressedasavalueinthesameformatasexpr1.expr1isatimeordatetimeexpression,andexpr2isatimeexpression.

    mysql>SELECTSUBTIME('2007123123:59:59.999999','11:1:1.000002')

    >'2007123022:58:58.999997'

    mysql>SELECTSUBTIME('01:00:00.999999','02:00:00.999998')

    >'00:59:59.999999'

    SYSDATE()

    Returnsthecurrentdateandtimeasavaluein'YYYYMMDDHH:MM:SS'orYYYYMMDDHHMMSS.uuuuuuformat,dependingonwhetherthefunctionisusedinastringornumericcontext.

    AsofMySQL5.0.12,SYSDATE()returnsthetimeatwhichitexecutes.ThisdiffersfromthebehaviorforNOW(),whichreturnsaconstanttimethatindicatesthetimeatwhichthestatementbegantoexecute.(Withinastoredfunctionortrigger,NOW()returnsthetimeatwhichthefunctionortriggeringstatementbegantoexecute.)

    mysql>SELECTNOW(),SLEEP(2),NOW()

    ++++

    |NOW()|SLEEP(2)|NOW()|

    ++++

    |2006041213:47:36|0|2006041213:47:36|

    ++++

    mysql>SELECTSYSDATE(),SLEEP(2),SYSDATE()

    ++++

    |SYSDATE()|SLEEP(2)|SYSDATE()|

    ++++

    |2006041213:47:44|0|2006041213:47:46|

    ++++

    Inaddition,theSETTIMESTAMPstatementaffectsthevaluereturnedbyNOW()butnotbySYSDATE().ThismeansthattimestampsettingsinthebinaryloghavenoeffectoninvocationsofSYSDATE().

    BecauseSYSDATE()canreturndifferentvaluesevenwithinthesamestatement,andisnotaffectedbySETTIMESTAMP,itisnondeterministicandthereforeunsafeforreplication.Ifthatisaproblem,youcanstarttheserverwiththesysdateisnowoptiontocauseSYSDATE()tobeanaliasforNOW().ThenondeterministicnatureofSYSDATE()alsomeansthatindexescannotbeusedforevaluatingexpressionsthatrefertoit.

    TIME(expr)

    Extractsthetimepartofthetimeordatetimeexpressionexprandreturnsitasastring.

    mysql>SELECTTIME('2003123101:02:03')

    >'01:02:03'

    mysql>SELECTTIME('2003123101:02:03.000123')

    >'01:02:03.000123'

    TIMEDIFF(expr1,expr2)

    TIMEDIFF()returnsexpr1expr2expressedasatimevalue.expr1andexpr2aretimeordateandtimeexpressions,butbothmustbeofthesametype.

    TheresultreturnedbyTIMEDIFF()islimitedtotherangeallowedforTIMEvalues.Alternatively,youcanuseeitherofthefunctionsTIMESTAMPDIFF()andUNIX_TIMESTAMP(),bothofwhichreturnintegers.

    mysql>SELECTTIMEDIFF('2000:01:0100:00:00',

    >'2000:01:0100:00:00.000001')

    >'00:00:00.000001'

    mysql>SELECTTIMEDIFF('2008123123:59:59.000001',

    >'2008123001:01:01.000002')

    >'46:58:57.999999'

    TIMESTAMP(expr),TIMESTAMP(expr1,expr2)

    Withasingleargument,thisfunctionreturnsthedateordatetimeexpressionexprasadatetimevalue.Withtwoarguments,itaddsthetimeexpressionexpr2tothedateordatetimeexpressionexpr1andreturnstheresultasadatetimevalue.

    mysql>SELECTTIMESTAMP('20031231')

    >'2003123100:00:00'

    mysql>SELECTTIMESTAMP('2003123112:00:00','12:00:00')

    >'2004010100:00:00'

    TIMESTAMPADD(unit,interval,datetime_expr)

    Addstheintegerexpressionintervaltothedateordatetimeexpressiondatetime_expr.Theunitforintervalisgivenbytheunitargument,whichshouldbeoneofthefollowingvalues:FRAC_SECOND(microseconds),SECOND,MINUTE,HOUR,DAY,WEEK,MONTH,QUARTER,orYEAR.

    BeginningwithMySQL5.0.60,itispossibletouseMICROSECONDinplaceofFRAC_SECONDwiththisfunction,andFRAC_SECONDisdeprecated.FRAC_SECONDisremovedinMySQL5.5.

    Theunitvaluemaybespecifiedusingoneofkeywordsasshown,orwithaprefixofSQL_TSI_.Forexample,DAYandSQL_TSI_DAYbotharelegal.

  • 6/12/2014 MySQL::MySQL5.0ReferenceManual::12.7DateandTimeFunctions

    http://dev.mysql.com/doc/refman/5.0/en/dateandtimefunctions.html 11/42

    mysql>SELECTTIMESTAMPADD(MINUTE,1,'20030102')

    >'2003010200:01:00'

    mysql>SELECTTIMESTAMPADD(WEEK,1,'20030102')

    >'20030109'

    TIMESTAMPDIFF(unit,datetime_expr1,datetime_expr2)

    Returnsdatetime_expr2datetime_expr1,wheredatetime_expr1anddatetime_expr2aredateordatetimeexpressions.Oneexpressionmaybeadateandtheotheradatetimeadatevalueistreatedasadatetimehavingthetimepart'00:00:00'wherenecessary.Theunitfortheresult(aninteger)isgivenbytheunitargument.ThelegalvaluesforunitarethesameasthoselistedinthedescriptionoftheTIMESTAMPADD()function.

    mysql>SELECTTIMESTAMPDIFF(MONTH,'20030201','20030501')

    >3

    mysql>SELECTTIMESTAMPDIFF(YEAR,'20020501','20010101')

    >1

    mysql>SELECTTIMESTAMPDIFF(MINUTE,'20030201','2003050112:05:55')

    >128885

    Note

    TheorderofthedateordatetimeargumentsforthisfunctionistheoppositeofthatusedwiththeTIMESTAMP()functionwheninvokedwith2arguments.

    TIME_FORMAT(time,format)

    ThisisusedliketheDATE_FORMAT()function,buttheformatstringmaycontainformatspecifiersonlyforhours,minutes,seconds,andmicroseconds.OtherspecifiersproduceaNULLvalueor0.

    Ifthetimevaluecontainsanhourpartthatisgreaterthan23,the%Hand%khourformatspecifiersproduceavaluelargerthantheusualrangeof0..23.Theotherhourformatspecifiersproducethehourvaluemodulo12.

    mysql>SELECTTIME_FORMAT('100:00:00','%H%k%h%I%l')

    >'10010004044'

    TIME_TO_SEC(time)

    Returnsthetimeargument,convertedtoseconds.

    mysql>SELECTTIME_TO_SEC('22:23:00')

    >80580

    mysql>SELECTTIME_TO_SEC('00:39:38')

    >2378

    TO_DAYS(date)

    Givenadatedate,returnsadaynumber(thenumberofdayssinceyear0).

    mysql>SELECTTO_DAYS(950501)

    >728779

    mysql>SELECTTO_DAYS('20071007')

    >733321

    TO_DAYS()isnotintendedforusewithvaluesthatprecedetheadventoftheGregoriancalendar(1582),becauseitdoesnottakeintoaccountthedaysthatwerelostwhenthecalendarwaschanged.Fordatesbefore1582(andpossiblyalateryearinotherlocales),resultsfromthisfunctionarenotreliable.SeeSection12.8,WhatCalendarIsUsedByMySQL?,fordetails.

    RememberthatMySQLconvertstwodigityearvaluesindatestofourdigitformusingtherulesinSection11.3,DateandTimeTypes.Forexample,'20081007'and'081007'areseenasidenticaldates:

    mysql>SELECTTO_DAYS('20081007'),TO_DAYS('081007')

    >733687,733687

    InMySQL,thezerodateisdefinedas'00000000',eventhoughthisdateisitselfconsideredinvalid.Thismeansthat,for'00000000'and'00000101',TO_DAYS()returnsthevaluesshownhere:

    mysql>SELECTTO_DAYS('00000000')

    ++

    |to_days('00000000')|

    ++

    |NULL|

    ++

    1rowinset,1warning(0.00sec)

    mysql>SHOWWARNINGS

    ++++

    |Level|Code|Message|

    ++++

    |Warning|1292|Incorrectdatetimevalue:'00000000'|

    ++++

    1rowinset(0.00sec)

  • 6/12/2014 MySQL::MySQL5.0ReferenceManual::12.7DateandTimeFunctions

    http://dev.mysql.com/doc/refman/5.0/en/dateandtimefunctions.html 12/42

    mysql>SELECTTO_DAYS('00000101')

    ++

    |to_days('00000101')|

    ++

    |1|

    ++

    1rowinset(0.00sec)

    ThisistruewhetherornottheALLOW_INVALID_DATESSQLservermode(availableinMySQL5.0.2andlater)isenabled.

    UNIX_TIMESTAMP(),UNIX_TIMESTAMP(date)

    Ifcalledwithnoargument,returnsaUnixtimestamp(secondssince'1970010100:00:00'UTC)asanunsignedinteger.IfUNIX_TIMESTAMP()iscalledwithadateargument,itreturnsthevalueoftheargumentassecondssince'1970010100:00:00'UTC.datemaybeaDATEstring,aDATETIMEstring,aTIMESTAMP,oranumberintheformatYYMMDDorYYYYMMDD.TheserverinterpretsdateasavalueinthecurrenttimezoneandconvertsittoaninternalvalueinUTC.ClientscansettheirtimezoneasdescribedinSection10.6,MySQLServerTimeZoneSupport.

    mysql>SELECTUNIX_TIMESTAMP()

    >1196440210

    mysql>SELECTUNIX_TIMESTAMP('2007113010:30:19')

    >1196440219

    WhenUNIX_TIMESTAMP()isusedonaTIMESTAMPcolumn,thefunctionreturnstheinternaltimestampvaluedirectly,withnoimplicitstringtoUnixtimestampconversion.IfyoupassanoutofrangedatetoUNIX_TIMESTAMP(),itreturns0.

    Note:IfyouuseUNIX_TIMESTAMP()andFROM_UNIXTIME()toconvertbetweenTIMESTAMPvaluesandUnixtimestampvalues,theconversionislossybecausethemappingisnotonetooneinbothdirections.Forexample,duetoconventionsforlocaltimezonechanges,itispossiblefortwoUNIX_TIMESTAMP()tomaptwoTIMESTAMPvaluestothesameUnixtimestampvalue.FROM_UNIXTIME()willmapthatvaluebacktoonlyoneoftheoriginalTIMESTAMPvalues.Hereisanexample,usingTIMESTAMPvaluesintheCETtimezone:

    mysql>SELECTUNIX_TIMESTAMP('2005032703:00:00')

    ++

    |UNIX_TIMESTAMP('2005032703:00:00')|

    ++

    |1111885200|

    ++

    mysql>SELECTUNIX_TIMESTAMP('2005032702:00:00')

    ++

    |UNIX_TIMESTAMP('2005032702:00:00')|

    ++

    |1111885200|

    ++

    mysql>SELECTFROM_UNIXTIME(1111885200)

    ++

    |FROM_UNIXTIME(1111885200)|

    ++

    |2005032703:00:00|

    ++

    IfyouwanttosubtractUNIX_TIMESTAMP()columns,youmightwanttocasttheresulttosignedintegers.SeeSection12.10,CastFunctionsandOperators.

    UTC_DATE,UTC_DATE()

    ReturnsthecurrentUTCdateasavaluein'YYYYMMDD'orYYYYMMDDformat,dependingonwhetherthefunctionisusedinastringornumericcontext.

    mysql>SELECTUTC_DATE(),UTC_DATE()+0

    >'20030814',20030814

    UTC_TIME,UTC_TIME()

    ReturnsthecurrentUTCtimeasavaluein'HH:MM:SS'orHHMMSS.uuuuuuformat,dependingonwhetherthefunctionisusedinastringornumericcontext.

    mysql>SELECTUTC_TIME(),UTC_TIME()+0

    >'18:07:53',180753.000000

    UTC_TIMESTAMP,UTC_TIMESTAMP()

    ReturnsthecurrentUTCdateandtimeasavaluein'YYYYMMDDHH:MM:SS'orYYYYMMDDHHMMSS.uuuuuuformat,dependingonwhetherthefunctionisusedinastringornumericcontext.

    mysql>SELECTUTC_TIMESTAMP(),UTC_TIMESTAMP()+0

    >'2003081418:08:04',20030814180804.000000

    WEEK(date[,mode])

    Thisfunctionreturnstheweeknumberfordate.ThetwoargumentformofWEEK()enablesyoutospecifywhethertheweekstartsonSundayorMondayandwhetherthereturnvalueshouldbeintherangefrom0to53

  • 6/12/2014 MySQL::MySQL5.0ReferenceManual::12.7DateandTimeFunctions

    http://dev.mysql.com/doc/refman/5.0/en/dateandtimefunctions.html 13/42

    orfrom1to53.Ifthemodeargumentisomitted,thevalueofthedefault_week_formatsystemvariableisused.SeeSection5.1.4,ServerSystemVariables.

    Thefollowingtabledescribeshowthemodeargumentworks.

    Mode Firstdayofweek Range Week1isthefirstweek0 Sunday 053 withaSundayinthisyear1 Monday 053 with4ormoredaysthisyear2 Sunday 153 withaSundayinthisyear3 Monday 153 with4ormoredaysthisyear4 Sunday 053 with4ormoredaysthisyear5 Monday 053 withaMondayinthisyear6 Sunday 153 with4ormoredaysthisyear7 Monday 153 withaMondayinthisyear

    Formodevalueswithameaningofwith4ormoredaysthisyear,weeksarenumberedaccordingtoISO8601:1988:

    IftheweekcontainingJanuary1has4ormoredaysinthenewyear,itisweek1.

    Otherwise,itisthelastweekofthepreviousyear,andthenextweekisweek1.

    mysql>SELECTWEEK('20080220')

    >7

    mysql>SELECTWEEK('20080220',0)

    >7

    mysql>SELECTWEEK('20080220',1)

    >8

    mysql>SELECTWEEK('20081231',1)

    >53

    Notethatifadatefallsinthelastweekofthepreviousyear,MySQLreturns0ifyoudonotuse2,3,6,or7astheoptionalmodeargument:

    mysql>SELECTYEAR('20000101'),WEEK('20000101',0)

    >2000,0

    OnemightarguethatWEEK()shouldreturn52becausethegivendateactuallyoccursinthe52ndweekof1999.WEEK()returns0insteadsothatthereturnvalueistheweeknumberinthegivenyear.ThismakesuseoftheWEEK()functionreliablewhencombinedwithotherfunctionsthatextractadatepartfromadate.

    Ifyoupreferaresultevaluatedwithrespecttotheyearthatcontainsthefirstdayoftheweekforthegivendate,use0,2,5,or7astheoptionalmodeargument.

    mysql>SELECTWEEK('20000101',2)

    >52

    Alternatively,usetheYEARWEEK()function:

    mysql>SELECTYEARWEEK('20000101')

    >199952

    mysql>SELECTMID(YEARWEEK('20000101'),5,2)

    >'52'

    WEEKDAY(date)

    Returnstheweekdayindexfordate(0=Monday,1=Tuesday,6=Sunday).

    mysql>SELECTWEEKDAY('2008020322:23:00')

    >6

    mysql>SELECTWEEKDAY('20071106')

    >1

    WEEKOFYEAR(date)

    Returnsthecalendarweekofthedateasanumberintherangefrom1to53.WEEKOFYEAR()isacompatibilityfunctionthatisequivalenttoWEEK(date,3).

    mysql>SELECTWEEKOFYEAR('20080220')

    >8

    YEAR(date)

    Returnstheyearfordate,intherange1000to9999,or0forthezerodate.

    mysql>SELECTYEAR('19870101')

    >1987

    YEARWEEK(date),YEARWEEK(date,mode)

    Returnsyearandweekforadate.ThemodeargumentworksexactlylikethemodeargumenttoWEEK().Theyearintheresultmaybedifferentfromtheyearinthedateargumentforthefirstandthelastweekoftheyear.

    mysql>SELECTYEARWEEK('19870101')

    >198653

  • 6/12/2014 MySQL::MySQL5.0ReferenceManual::12.7DateandTimeFunctions

    http://dev.mysql.com/doc/refman/5.0/en/dateandtimefunctions.html 14/42

    NotethattheweeknumberisdifferentfromwhattheWEEK()functionwouldreturn(0)foroptionalarguments0or1,asWEEK()thenreturnstheweekinthecontextofthegivenyear.

    Previous/Next/Up/TableofContents

    UserCommentsPostedbyIsaacShepardonOctober1120032:53pm [Delete][Edit]

    Ifyou'relookingforgenericSQLqueriesthatwillallowyoutogetthedays,months,andyearsbetweenanytwogivendates,youmightconsiderusingthese.Youjustneedtosubstitutedate1anddate2withyourdateexpressions.

    NOTE:Someoftheseformulasarecomplexbecausetheyaccountforallcaseswheredate1date2.Additionally,theseformulascanbeusedinverygenericquerieswherealiasesandtemporaryvariablesarenotallowed.

    Numberofdaysbetweendate1anddate2:

    TO_DAYS(date2)TO_DAYS(date1)

    Numberofmonthsbetweendate1anddate2:

    IF((((YEAR(date2)1)*12+MONTH(date2))((YEAR(date1)1)*12+MONTH(date1)))>0,(((YEAR(date2)1)*12+MONTH(date2))((YEAR(date1)1)*12+MONTH(date1)))(MID(date2,9,2)

  • 6/12/2014 MySQL::MySQL5.0ReferenceManual::12.7DateandTimeFunctions

    http://dev.mysql.com/doc/refman/5.0/en/dateandtimefunctions.html 15/42

    NotethatthebuiltindefaultvaluesfortheDATEandDATEFIELDcolumntypesisoutofrange.Forexample,00000000isavalidwayofexpressingNULL,butifthecolumnissetasNOTNULL,00000000isstillthedefaultvalue.ThiscancauseproblemswithsomeapplicationsusingMySQL.

    PostedbyasdacfddsfdsfonJanuary2720043:25am [Delete][Edit]

    Iwaslookingforafunctiontodetectifthecurrentweekisoddoreven.IcouldnotfindonesoIusethis:MOD((DATE_FORMAT(CURDATE(),"%v")),2)Theoutputisa'0'(even)ora'1'(odd)

    PostedbySteveWestonFebruary15200410:49pm [Delete][Edit]

    TocreateaDATETIMEofNOW()inUTCwithoutupgradingto4.1.1,justuse:

    DATE_ADD('19700101',INTERVALUNIX_TIMESTAMP()SECOND)

    Postedby[namewithheld]onMarch420049:39am [Delete][Edit]

    workaroundforSTR_TO_DATEpreversion4.1.1.uglybutitseemstoworkfine.

    assumption:youknowtheformatofthereceiveddate(inthebelowexampletheformatismm/dd/yy,m/d/yy,mm/dd/yyyy,etc)

    thestatementextractstheyearbylocatingtheindexofthesecond'/'andreadingfromtherightofthestringtothatindex.theindexofthesecondis'/'isfoundbyusingLOCATEwiththeindexofthefirst'/'.itextractsthedaybylocatingtheindecesofthefirstandsecond'/'andreadingbetweenthemitextractsthemonthbylocatingtheindexofthefirst'/'andreadingfromtheleftofthestringtothatindex.itthenCONCATstheyearmonthanddaypiecestogetherseparatingthemwithhyphens.lastly,itletsDATE_FORMATdoitsmagiconthestring.

    (replacetheteststring'1/11/03'withyourfieldname,etc)

    selectDATE_FORMAT(CONCAT(RIGHT('1/11/03',length('1/11/03')LOCATE('/','1/11/03',LOCATE('/','1/11/03')+1)),'',LEFT('1/11/03',LOCATE('/','1/11/03')1),'',SUBSTRING('1/11/03',LOCATE('/','1/11/03')+1,LOCATE('/','1/11/03',LOCATE('/','1/11/03')+1)LOCATE('/','1/11/03')1)),'%Y%m%d')

    PostedbyOlavAlexanderMjeldeonMarch15200411:15am [Delete][Edit]

    Letssayyouhavethemysqlbefore4.1.1(wheretimediff()wasimplementet),andyouwanttodoatimediff.

    Iwantedtomakea"activeusers"onmypage,butIfoundoutthatIdidnthavethetimedifffunction(tofindpersonswhichhavebeenactivewithin5minutes).

    So,Ifiguredthisqueryout:

    SELECTnickFROM`users`WHERETO_DAYS(NOW())TO_DAYS(last_login)

  • 6/12/2014 MySQL::MySQL5.0ReferenceManual::12.7DateandTimeFunctions

    http://dev.mysql.com/doc/refman/5.0/en/dateandtimefunctions.html 16/42

    $lastLogin=strtotime($row['lastLogin'])$diff=$now$lastLogin$now=date('YmdHis',$now)

    if($diff>3600){//3600secondsis1hour$query='UPDATEmembersSETlogins=logins+1,lastLogin='.$now.'WHEREmemberID='.$SEC_IDmysql_query($query)}

    NowthedateenteredisthePHPtime(thataccountsforDST)andwearecomparingittoPHPtimesoalliswell.

    IthinkthisapproachwillworkwellforanytimeyouwishtoenteradateintoMySQLusingPHP.Justformatthedateusingthe"YmdHis"formatstringandusethestrtotime()functiontoreadadateretrievedfromMySQL.

    Theadvantagetothisapproachratherthanjustenteringthe"normal"PHPdateintoacharortextfieldisthatthedatesare"human"readableinthetableandalltheMySQLdate/timefunctionsareavailableforfuturequeries.

    PostedbyMartinSchwedesonApril2520049:11am [Delete][Edit]

    tolocalizetheweekday:SELECTELT(WEEKDAY('20040410')+1,'Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag','Sonntag')

    longversionwithmonth:SELECTDATE_FORMAT('20040410',CONCAT(ELT(WEEKDAY('20040410')+1,'Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag','Sonntag'),',%d.',ELT(MONTH('20040410'),'Januar','Februar','Mrz','April','Mai','Juni','Juli','August','September','Oktober','November','Dezember'),'%Y'))>Samstag,10.April2004

    sameforunixtimestamp:SELECTDATE_FORMAT(FROM_UNIXTIME(1081548000),CONCAT(ELT(WEEKDAY(FROM_UNIXTIME(1081548000))+1,'Mo','Di','Mi','Do','Fr','Sa','So'),',%d.',ELT(MONTH(FROM_UNIXTIME(1081548000)),'Jan.','Feb.','Mrz','April','Mai','Juni','Juli','Aug.','Sept.','Okt.','Nov.','Dez.'),'%Y'))>Sa,10.April2004

    PostedbyPhilippePoelvoordeonApril3020045:50am [Delete][Edit]

    Ihadtoqueryatableandretrieverowsthatwereaddedonlytoday,so:

    selectidfrommy_tablewheretimestamp=date_format(CURRENT_TIMESTAMP(),'%Y%m%d000000')

    startingwithMySQL4.0,youcouldalsousetheBETWEEN...ANDsyntax.Ifanyonehasabetterquerytodothat,letmeknow.

    PostedbyMichaelMarcusonMay120042:41pm [Delete][Edit]

    AfterreadingnumerousarticlesandpostsregardingconvertingbackandforthbetweenSQLdatetimeandVBscriptdatetime,Ioptedforthesimplestsolutionformydatabases.Isimplysavealldatetimevaluesinvarchar(20)fieldsandcalloneitherMySQLorVBscriptfunctionstogetdatetimevaluesorcheck/convertdatetimevalues.Forexample:

    currentDT=CStr(cn.execute("SELECTNOW()").Fields(0).Value)

    willfetchcurrentdatetimeintheSQLserver'sdatetimeformatandthenconvertittoastring.[Obviously,cnissetbySetcn=Server.CreateObject("ADODB.Connection")tocreatethedatabaseconnection,thenthedatabaseisopenedwithacn.open(parameters).]

    Youcanthensavethisstringtoanappropriatefieldsuchas'flddate_added'whichisformattedasvarchar(20).

    Whenretrievingtheflddate_addedvalue,youcanusethisVBscriptcodetocheckifthevalueisindeedadatetimevalueandconvertittothedatetimeformatoftheuser'scomputer"

    ifIsDate(flddate_added)then=CDate(flddate_added)'converttouser'ssystemformatfordisplayusinguser'scodepageelse=flddate_added'justdisplaythestringendif

    TheabovemethodsallowmetogetaroundalloftheissuesregardingVBscript'sdatetimedisplayformatdifferencesdependingonthesystemlocal.

    PostedbyRayMorrisonJuly1520044:37pm [Delete][Edit]

    PostedbyFilipWolak:

    >Severaltimesihavecometoafollowngdate/timeproblem:>Inthetableiamstoringbothdateandtimeinformationinthedatetime>column.Querying,IwanttoreceiveCOUNTedresultsgroupedbydate,>andnotdateandtime....>SELECTsubstring(postdate,1,10)...

    Ifit'saDATETIMEcolumnthansubstringisnotappropriateit'slogicallynonsensicalofcourse,andjusthappenstoworkinsomeversionofMySQLbecausetheDATETIMEhappenstoberepresentedbyastringinsomecontexts.BetterwouldbetotreattheDATETIMEasaDATETIMEratherthanasastring,whichwillworkinfutureversionsofMYSQLandinotherRDMS:SELECTDATE(postdate)...

    PostedbyDavidLyononJuly1720044:12pm [Delete][Edit]

    HereisanotherVB/ASPfunctionforconvertingDatesfromstandardtoMySQLformat.Cherisegaveaniceexampleabove,butithasextracomplexityduetotheuseofarraysandalsomaybepronedtouserinputerrors.

    ThefollowingexamplewillworkbasedontheLocalizationsettingsoftheserveronwhichitisrun.Soitshouldn'tcarewhetherthedateisddmmyyyy,mm/dd/yy,

  • 6/12/2014 MySQL::MySQL5.0ReferenceManual::12.7DateandTimeFunctions

    http://dev.mysql.com/doc/refman/5.0/en/dateandtimefunctions.html 17/42

    mm/dd/yyyy,mdyy,etc.Justmakesureyoupassitadatevaluethatisformattedcomplianttotheserver'slocalization.IfnecessaryuseVB'sCDate(strDateValue)beforepassingstrDateValuetothefunction.

    YoucanalsoeasilymodifythisfunctiontodothesameforTimevalues,exceptyouuseHour,Minute,andSecondVBfunctions,anddelimitwithacolon(:)insteadofadash().

    Hopethishelps!

    FunctionfuncMySqlDate(dtmChangeDate)'CONVERTSLOCALIZEDDATEFORMAT(forexample:m/d/yy)TOMySQLFORMAT(yyyymmdd)DimstrTempYear,strTempMonth,strTempDaystrTempYear=Year(dtmChangeDate)strTempMonth=Month(dtmChangeDate)strTempDay=Day(dtmChangeDate)

    ifLen(strTempYear)=2then'Y2KTEST19382037ADJUSTASNECESSARYifstrTempYear>=38thenstrTempYear="19"&strTempYearelsestrTempYear="20"&strTempYearendifendififstrTempMonth

  • 6/12/2014 MySQL::MySQL5.0ReferenceManual::12.7DateandTimeFunctions

    http://dev.mysql.com/doc/refman/5.0/en/dateandtimefunctions.html 18/42

    seemstoworkwell.

    PostedbyMartinAlgestenonSeptember920042:00pm [Delete][Edit]

    >Severaltimesihavecometoafollowngdate/timeproblem:>Inthetableiamstoringbothdateandtimeinformationinthe>datetimecolumn.Querying,IwanttoreceiveCOUNTedresults>groupedbydate,andnotdateandtime.Icametotheeasy>solution:

    Ineededaqueryforamoregeneralcasetodotimebasedreportingonarbitrarybig"slices"oftimestampeddata.

    Mytablehasacolumn'timestamp'whichisoftype'datetime'.

    Thefollowingmakes'120'secondbigslices

    selectfrom_unixtime(unix_timestamp(timestamp)unix_timestamp(timestamp)%120)asslice,...groupbyslice

    PostedbyDavidBerryonSeptember1720047:08pm [Delete][Edit]

    Iwantedtofindthestartdate(Sunday)andtheenddate(Saturday)foranygivenweekwhenallIhadtogofromisanarbitrarydate(moreprecisely,thecurrentdate).SinceMySQLregistersSundayas1,andSaturdayas7,ifyouwishtoadjustthestartandendpointsonaweek,you'llhavetomodifythefollowingfunctioncallsappropriately,andchangetheintegers,or(asIhavedone)usevariables:

    set@someday=curdate()set@weekstart=1//Sundayset@weekend=7//Saturday

    endofweek:selectdate_add(@someday,interval@weekenddayofweek(@someday)day)

    beginningofweek:selectdate_sub(@someday,intervaldayofweek(@someday)@weekstartday)

    Ofcourse,Iusethesefunctionsinamorecomplexquerythatfiltersselectresultsfromatablewitha"datetime"field.Thisallowsmetofocusonweeklydata.Averyneatthingisbeingabletoreplace'curdate()'withadateat(theoretically)anypointintimeontheGregoriancalendar.

    PostedbyJeffreyFriedlonOctober3120049:05am [Delete][Edit]

    Thevaluereturnedby

    UNIX_TIMESTAMP(NOW())

    canbequiteunintuitiveduringthelasthourofdaylightsavingtimeinthefall,asitcanreturnatimestampthat'sanhouraheadofthecurrenttime.(Thedocsindicatethatthismaybe"fixed"from4.1.3,butIhavenottested.)

    ThisisbecauseCSTrelatedinformationislostduringtheconversionbyNOW()fromthecurrenttimetoastring.Whenpresentedadatestringlike"2004103101:52:37"whichnamesatimethathappenedtwice(onceduringdaylightsavingtime,andagainanhourlaterinstandardtime),itdoesn'tknowwhichyouintendittobeinterpretedas.

    Thedocsindicatethatfrom4.1.3,itusesthetimezoneineffectatthetimeoftheSELECT,whichimpliesthat

    FROM_UNIXTIME("2004103101:52:37")

    returnsadifferentvaluedependingonwhetheryouarecurrentlyunderdaylightsavingtimeornot.With4.1.2andbefore,itseemstoalwaysusestandardtime,andhencetheonehour"error"(whichisnotreallyanerror,butdamnunintuitivethatUNIX_TIMESTAMP(NOW())doesnotreturntheUNIX_TIMESTAMPfornow.

    NotethatUNIX_TIMESTAMP()withoutargsdoesreturntheproperunixtimestampforthecurrenttime.

    PostedbyShamuntohaonDecember18200410:45am [Delete][Edit]

    Ifyouhaveatable1,and(fieldsdatewhichisvarchar(100)youcanalsoconvertitasdatetypelookthefollowingexample

    mysql>selectstr_to_date(date,'%d/%m/%Y')asMydatefromtable1orderbyMydateDESC

    ++|Mydate|++|20041216||20041215||20041202||20041202||20041101||20041029||20041012||20041007||20040912||20040819||20040813||20040809||20040804||20040730||20040726||20040720||20040716||20040714|++

    18rowsinset(0.00sec)

    mysql>

    PostedbyJohnRomanoonJanuary26200510:06pm [Delete][Edit]

  • 6/12/2014 MySQL::MySQL5.0ReferenceManual::12.7DateandTimeFunctions

    http://dev.mysql.com/doc/refman/5.0/en/dateandtimefunctions.html 19/42

    IfyouneedtoEXTRACTtheQUARTERpriortov5.0tryCEILING(EXTRACT(MONTHFROMdate)/3)

    PostedbyRobertChristiaanseonJanuary2720052:18pm [Delete][Edit]

    CALCULATINGADATEUSINGAWEEKNUMBER

    Ifyouwanttocalculatethedatehavingayear,adayoftheweekandaweeknumber(Let'ssayThursdayofweeknumber4in2005),youcancalculateitlikethis:

    SELECTDATE_ADD('20050104',INTERVAL((41)*7+(4DATE_FORMAT('20050104','%w')))DAY)

    InPHPitwouldbesomethinglikethis(whenweeksstartonMonday):

    $Days=array('xx','ma','di','wo','do','vr','za','zo')$DayOfWeek=array_search($aDay,$Days)//getdayofweek(1=Monday)$Year=2005$Week=4

    $query="SELECTDATE_ADD('".$Year."0104',INTERVAL((".$Week."1)*7+(".$DayOfWeek."DATE_FORMAT('".$Year."0104','%w')))DAY)"

    January4thischosenasabase,becauseitisalwaysinweeknumber1.(January1stisnotnecessarelyinweek1!)

    Youcantestitwiththis:

  • 6/12/2014 MySQL::MySQL5.0ReferenceManual::12.7DateandTimeFunctions

    http://dev.mysql.com/doc/refman/5.0/en/dateandtimefunctions.html 20/42

    PostedbyErinQuickLaughlinonMarch29200512:49am [Delete][Edit]

    TotakeChericeScharf'svbexampleonestepfurther,here'stheconversionfromvb'snowformatof'MM/DD/YYHH:MM:SSPM'to'YYYYMMDDHH:MM:SS'foreasyinsertiontothedatetimefield:

    FunctionConvertInputDateTime(varDateTime)

    If(Len(Trim(varDateTime))>0)ThenDateTimeArray=Split(CStr(varDateTime),"")

    varDate=DateTimeArray(0)varTime=DateTimeArray(1)varAMPM=DateTimeArray(2)

    If(Len(Trim(varDate))>0)ThenDateArray=Split(CStr(varDate),"/")

    IFLen(Trim(DateArray(0)))

  • 6/12/2014 MySQL::MySQL5.0ReferenceManual::12.7DateandTimeFunctions

    http://dev.mysql.com/doc/refman/5.0/en/dateandtimefunctions.html 21/42

    ++|200411|200412|200413|200414|200415|...|etc...++

    Hereisapieceofcodewhichwillmakesuchtable:

  • 6/12/2014 MySQL::MySQL5.0ReferenceManual::12.7DateandTimeFunctions

    http://dev.mysql.com/doc/refman/5.0/en/dateandtimefunctions.html 22/42

    PostedbyOliverPereiraonJuly1920051:40pm [Delete][Edit]

    ThedescriptionofFROM_DAYS(N)"GivenadaynumberN,returnsaDATEvalue"usestheterm"daynumber"withoutexplainingit.

    ThedescriptionofTO_DAYS(date)"Givenadatedate,returnsadaynumber(thenumberofdayssinceyear0)"lowerdownthepageatleasttriestoexplaintheterm,butunsuccessfully.

    Therearetwoproblemshere.Firstly,therewasnoyear0intheGregoriancalendar.Secondly,anumberofdayshastobecountedfromaday,notayear.Dotheymeanthebeginningofthe(nonexistent)year,ortheendofthe(nonexistent)year?Dononexistentyearsevenhavebeginningsandends?Someoneshouldamendthesedescriptions.

    PostedbyksonAugust1220057:51am [Delete][Edit]

    Here'sanotherquerytogetthenumberofmonthsbetweentwodates:selectperiod_diff(DATE_FORMAT(date1,'%Y%m'),DATE_FORMAT(date2,'%Y%m'))fromtablexy

    PostedbyBobTerrellonAugust2220055:40pm [Delete][Edit]

    Notethatthereiscurrentlynowaytogetthe'AM'or'PM'partofatimeonlyvalueusingthebuiltinfunctions.YoumustfirstconvertittoadatetimeandthenuseDATE_FORMAT('%p')orperformyourowncalculationsinyourapp.

    PostedbyDeronMerandaonAugust3120058:33pm [Delete][Edit]

    Ontransactionalconsistency...Concerningthefunctionswhichusetherealcurrenttime,suchasNOW(),themanualsays"Functionsthatreturnthecurrentdateortimeeachareevaluatedonlyonceperqueryatthestartofqueryexecution."

    Notethoughthatthisdoesnotapplyacrossentiretransactions,asyoumayexpect.Thusatransactionlike:

    STARTTRANSACTIONINSERTINTOEVENTSVALUES(NOW(),'A')INSERTINTOEVENTSVALUES(NOW(),'B')COMMIT

    willresultinpotentiallytwodifferenttimesbeingrecordedforthetworecords.

    PostedbycamerongreenonSeptember1620056:13am [Delete][Edit]

    Ifyouneedthetypetobedynamicallytakenfromatable(thatiswhereyouhave"year","day","month"etcasacolumninthetable),hereisthebestwayIcouldworkouttodoit.Expandasnecessary:

    SELECTset_date,unit_period,unit_multiplier,CASEWHENunit_period="month"THENDATE_SUB(set_date,INTERVALunit_multiplierMONTH)WHENunit_period="week"THENDATE_SUB(set_date,INTERVAL(unit_multiplier*7)DAY)WHENunit_period="year"THENDATE_SUB(set_date,INTERVALunit_multiplierYEAR)ELSEDATE_SUB(set_date,INTERVALunit_multiplierDAY)ENDFROMdates_table

    PostedbyAndrzejSalamononSeptember2220051:27pm [Delete][Edit]

    Returnsallrowsfromactualmonthtogiven@months.eg.ifyouwantgetallrowsin:

    5monthsfromnow:(200509)5=(200504)allrowsfrom20050401to20050430

    2monthsfromnow(200509)2=(200507)allrowsfrom20050701to20050731

    SQLvariables,canbePHPvariableslike$months,$nextMonth,$begin,$end

    set@months=1#changeonlythisvalue(monthsbackfromactualmonth)set@nextMonth=@months+1

    set@begin=FROM_DAYS(TO_DAYS(LAST_DAY(DATE_SUB(NOW(),INTERVAL@nextMonthMONTH)))+1)

    set@end=FROM_DAYS(TO_DAYS(LAST_DAY(DATE_SUB(NOW(),INTERVAL@monthsMONTH)))+1)

    SELECTcols_u_wantFROMtbl_u_wantWHEREtimestampColBETWEEN@beginAND@end

    It`smysolution.IfUhaveYourownpleaseemailme.Sorryformyenglish:)

    PostedbyBryanDonovanonNovember1420059:22pm [Delete][Edit]

    I'mnotsureifthisisthebestway,butitworkstogetthedateoftheMondayoftheweekofadate.Forexample,ifyouhaveadatetimecolumncalledstarttimeinatablecalledtest_events,youcouldselectthedistinctMondaysfromyourtableasfollows:

    SELECTDISTINCT(STR_TO_DATE(CONCAT(YEARWEEK(starttime),'1'),'%x%v%w'))FROMtest_events

    Hopefullythereisabetterway..

    PostedbyRodolfoMaripanonNovember2920053:52pm [Delete][Edit]

    Iwasusingmysqlv4andthedatewasinavarchardatatype,inordertochangethedatatypeinmysqlv5iusethefollowingcode:

    updatessd_escondida.tactual_sag4setssd_escondida.tactual_sag4.Fecha=str_to_date(ssd_escondida.tactual_sag4.Fecha2,'%e/%m/%Y')

    where:

    ssd_escondida:databasetactual_sag4:isatableFecha:isadatetypeFecha2:isavarcharwhichcontainsadate,butisfrom01/01/2005to04/01/2005(withazeroatthebegining)

    whyiused%einsteadof%d???theanswerisverysimple,thereisaproblemwithdehelpaboutstr_to_date:%d:representsthedays,butfrom0to31and...

  • 6/12/2014 MySQL::MySQL5.0ReferenceManual::12.7DateandTimeFunctions

    http://dev.mysql.com/doc/refman/5.0/en/dateandtimefunctions.html 23/42

    %e:representsthedays,butfrom00to31.that'sthereasonwhywecannotuse:str_to_date('00/00/0000',%d/%m/%Y),wemustusestr_to_date('00/00/0000','%e/%m/%Y')Anotherwayinordertochangeastringlike:00/00/0000toadateistouse:str_to_date('00/00/0000','0%d/%m/%Y')

    PostedbyReginaMullenonDecember3200510:25pm [Delete][Edit]

    SimplemethodofconvertingdatesfromanyofMMDDYYYYMM/DD/YYYYMM.DD.YYYY(oldDate)toYYYYMMDD(addDate).Loaddateinastextandconvertinonegousing:

    updatetablesetaddDate=CONCAT_WS('',RIGHT(oldDate,4),LEFT(oldDate,2),SUBSTRING(oldDate,4,2))

    Caveat:makesureyourtextinputdoesn'thavespaces.

    PostedbyHyperHackeronDecember26200510:54pm [Delete][Edit]

    InMySQL4.0,andpossiblyothers,UNIX_TIMESTAMP()doesn'tworkwithdatesbefore1970.Thisquerydoesthesame,andworkswithanydatefromfromFri,13Dec190120:45:54toTue,19Jan203803:14:07.'date'isthenameoftheDATETIMEcolumnyouneedatimestampof.

    SELECT(((TO_DAYS(date)*86400)+TIME_TO_SEC(date))(TO_DAYS("19700101")*86400))AStimestamp

    Ifyou'reusingPHP,notethatdate()accountsforDSTandthusmayappeartoreturnincorrectresultsalso,don'tforgettoescapethequotesaround19700101.

    PostedbyNoelAthaideonDecember2720058:23am [Delete][Edit]

    Keyphrases:Birthdayreminder,selectdatesbetween

    Thismightbeuseful.Ifyouhaveadatabasecontaining'name'and'birthday'(ascolumns)thenthefollowingquerywilllistthebirthdaysinthenext15days.(16tobemoreprecise:))

    WhatIfounduniqueaboutthisproblemisthattheYEAR(ofbirth)willalwaysbedifferentandhenceonecannotsimplyuseaquerylike:

    |SELECT*FROM`friends`WHERE|`birthday`>=CURDATE()|AND|`birthday`=DAYOFMONTH(CURDATE())|AND|DAYOFMONTH(`birthday`)

  • 6/12/2014 MySQL::MySQL5.0ReferenceManual::12.7DateandTimeFunctions

    http://dev.mysql.com/doc/refman/5.0/en/dateandtimefunctions.html 24/42

    ORDERBYmonth,day,user_idASC

    sorryforthestrangename,butthisisthewaymytablearenamed...

    hopeyoulikeit

    PostedbyStijnTasonJanuary2320064:07pm [Delete][Edit]

    I'musingthisqueryforabirthdayreminder:

    SELECT`geb_Geboorte`FROM`gebruikers`WHEREDAYOFYEAR(curdate())=dayofyear(`geb_Geboorte`)

    Ichangetheyearofbirthdaytothecurrentyear.Sorryforthedutchtablenames.

    PostedbyJohnL.onJanuary2520063:56pm [Delete][Edit]

    Ittookmeabitoftimetofindhowtoselectdatabasedontimeperiods(suchasforquarterlyoryearlyreports).Youcanusegroupbymonth(DateTypeColumn).

    exampletofindperiodictotals:SELECT[Year|Quarter|Month|Day](date)asPeriod,shipcountry,shipstate,shipcity,sum(products),sum(shipping),sum(tax)FROMproductsNATURALJOINshippingNATURALJOINtaxGROUPBYPeriod,shipcountry,shipstate,shipcity

    moreherehttp://dev.mysql.com/doc/refman/5.0/en/dateandtimefunctions.html

    Isupposeyoucouldalterthestartofquarterlyperiodsbydoingsomearithmeticonthe(date),butyoumighthavetodosomeconversions.

    Postedby[namewithheld]onMarch620067:32pm [Delete][Edit]

    TimearithmeticusingCURTIME()isquitewillingtotypeeverythingintointegersratherthanaddingandsubtractingseconds.Forexample,wherelog_timeisaTIMEcolumn

    SELECTlog_timeASTimeFROMcall_logWHERElog_time>=(CURTIME()60)

    willfetchallresultsfromthelast60seconds.However,

    SELECTlog_timeASTimeFROMcall_logWHERElog_time>=(CURTIME()900)

    willfetchallresultsfromthelast9minutes.900isinterpreted,notas900seconds(15minutes),butas9:00.Anhouris10000(1:00:00),not3600(36:00).

    Ifyouwanttoaddseconds,usesomethinglikethefollowing(forthelasthour)

    SELECTlog_timeASTimeFROMcall_logWHERElog_time>=(CURTIME()SEC_TO_TIME(3600))

    PostedbyIssacGoldstandonMarch9200612:34am [Delete][Edit]

    Ifyouhaveacolumnofdatevaluesandyouwanttocomparethedayportionofthemwithtoday'sdate,takinginmindshortermonthswhichmightnotcontainallthedatesinyourset(example,billingsystemsoranythingelsewhichneedstorunoneachrecordorrecordsetonagivendayofthemonth),youcantryoneofthese(replacing'20020430'withthedatefieldyou'recomparing):

    SELECTDATE_FORMAT(CURDATE()INTERVAL1MONTH,CONCAT('%Y%m',DAY('20020430')))+INTERVAL1MONTH

    Thistendsto"rounddown"onmissingdaysforexamplefordatesendingin30,thiswilltranslatetofeb28(infebruary).

    PostedbyMarkoKruustkonApril520062:19pm [Delete][Edit]

    Inreplyto"DavidBerryonSeptember1720049:08pm"

    Problem:Tofindweekstartandenddatewithuserspecifiedstartoftheweekdayanduserspecifieddateforwhichtheweekistobefound.

    David'ssolutiondoesnotworkwithuserspecifiedweekstartandend.Itonlyworkswithnormalweekwhichis1and7asstartandendcorrespondingly.

    AsIneededdifferentstartingdayforweekthanSundayorMondayfortimesheetcalculations,Ihadtocomeupwithworkingsolution:

    ...

    date_sub(t.date,intervalif(dayofweek(t.date)$weekStartingDay>=0,dayofweek(t.date)$weekStartingDay,dayofweek(t.date)$weekStartingDay+7)day)week_start

    ...

    date_sub(t.date,intervalif(dayofweek(t.date)$weekStartingDay>=0,dayofweek(t.date)$weekStartingDay,dayofweek(t.date)$weekStartingDay+7)6day)week_end

    ...

    Thissolutionworksfineforme,atleastatthemomenttillIfindsomebuginit:)

    Postedby[namewithheld]onApril1420063:57am [Delete][Edit]

    UsethistofindthedateofthelastFriday.Pleaseletmeknowifthereisamoreefficientwayofdoingthis.

    selectif(DATE_FORMAT(curdate(),'%w')>4,date_sub(curdate(),INTERVALDATE_FORMAT(curdate(),'%w')5DAY),date_sub(curdate(),INTERVALDATE_FORMAT(curdate(),'%w')+2DAY))

    PostedbyHorstSchirmeieronApril17200611:16pm [Delete][Edit]

    Justanotherexampleonhowtofigureouthowmanydaysareuntilsomebirthdate(inordertodoarangequery,orgetthe"next"birthday):

  • 6/12/2014 MySQL::MySQL5.0ReferenceManual::12.7DateandTimeFunctions

    http://dev.mysql.com/doc/refman/5.0/en/dateandtimefunctions.html 25/42

    SELECTname,birthday,IF(DAYOFYEAR(birthday)>=DAYOFYEAR(NOW()),DAYOFYEAR(birthday)DAYOFYEAR(NOW()),DAYOFYEAR(birthday)DAYOFYEAR(NOW())+DAYOFYEAR(CONCAT(YEAR(NOW()),'1231')))ASdistanceFROMbirthdates

    The+DAYOFYEAR(CONCAT(YEAR(NOW()),'1231'))(whichis366or365,dependingonwhetherwe'reinaleapyearornot)takescareoftheNewYear'sEvewraparound.

    YoucouldaddWHEREdistance

  • 6/12/2014 MySQL::MySQL5.0ReferenceManual::12.7DateandTimeFunctions

    http://dev.mysql.com/doc/refman/5.0/en/dateandtimefunctions.html 26/42

    Togetthelastdayofthecurrentmonth:

    SELECT(SUBDATE(ADDDATE(CURDATE(),INTERVAL1MONTH),INTERVALDAYOFMONTH(CURDATE())DAY))ASLastDayOfTheMonth

    Thiswillgiveyouthefirstdayofthemonth.

    mysql>SELECT(SUBDATE(ADDDATE(CURDATE(),INTERVAL1MONTH),INTERVALDAYOFMONTH(CURDATE())DAY))ASLastDayOfTheMonth

    ++|LastDayOfTheMonth|++|20060731|++

    1rowinset

    Hopethishelps!

    PostedbyJordanGrayonAugust1200611:17am [Delete][Edit]

    Thisfunctionwillreturnthedifferencebetweentwodatesasastring,intheformat"Yyear[s],Mmonth[s],Dday[s]"(pluralisationasappropriate):

    |CREATEFUNCTIONgetDateDifferenceString(date1DATE,date2DATE)RETURNSVARCHAR(30)|RETURNCONCAT(|/*Yearsbetween*/|@years:=TIMESTAMPDIFF(YEAR,date1,date2),|IF(@years=1,'year,','years,'),|/*Monthsbetween*/|@months:=TIMESTAMPDIFF(MONTH,DATE_ADD(date1,INTERVAL@yearsYEAR),date2),|IF(@months=1,'month,','months,'),|/*Daysbetween*/|@days:=TIMESTAMPDIFF(DAY,DATE_ADD(date1,INTERVAL@years*12+@monthsMONTH),date2),|IF(@days=1,'day','days')|)|;

    Ittookawhiletoworkthisoneout,soIhopethismightsavesomeoneelsethebother.

    PostedbyDaevidVincentonAugust420067:14am [Delete][Edit]

    I'mnotsurewhyHorstSchirmeierdidthatverycomplexbirthdateequation.Seemstomeyoucouldjustdo:

    SET@DOYNOW=DAYOFYEAR(CURDATE())

    SELECT(DAYOFYEAR(birthdate)@DOYNOW)ASbirthdays,birthdate,@DOYNOW,CURDATE()FROMusersWHEREbirthdateISNOTNULL

    thenifbirthdays==0,it'sthatpersonsbirthday,otherwiseyouknowifthebirthdayisinthefuturebyhowmanydays,orifyoumisseditandhowmanybeersyouowethem...

    (althoughthemissed/negativedaysseemstobeoff)

    +++++|birthdays|birthdate|@DOYNOW|CURDATE()|+++++|83|19691026|216|20060804||3|19810807|216|20060804||1|19720802|216|20060804||0|19460804|216|20060804||151|19760305|216|20060804|+++++

    Shouldn'tthat1be2?AmImissingsomethingobvious?

    IfIdo"SELECTDATEDIFF('20060801',CURDATE())"Iget2asIexpect.

    So,Iguesstherealsolutionistousethis:

    SET@YEAR=CONCAT(EXTRACT(YEARFROMCURDATE()),'')

    SELECTDATEDIFF(CONCAT(@YEAR,DATE_FORMAT(birthdate,'%m%d')),CURDATE())ASbirthdays,birthdate,CURDATE()FROMusersWHEREbirthdateISNOTNULL

    ++++|birthdays|birthdate|CURDATE()|++++|83|19691026|20060804||3|19810807|20060804||2|19720802|20060804||0|19460804|20060804||152|19760305|20060804|++++

    Bytheway,ifyou'reusingPHPorsomeotherscriptinglanguage,youcangetridofthe@YEARstuffandjustdo:

    DATEDIFF(DATE_FORMAT(birthdate,'".date('Y')."%m%d'),CURDATE())ASbirthdays

  • 6/12/2014 MySQL::MySQL5.0ReferenceManual::12.7DateandTimeFunctions

    http://dev.mysql.com/doc/refman/5.0/en/dateandtimefunctions.html 27/42

    PostedbyArturasD.onAugust18200611:11am [Delete][Edit]

    Keyphrases:Birthdayreminder

    Thisisanotherqueryforthebirthdayremainder:

    |SELECT*FROM`users`|WHERE|(|DAYOFYEAR(NOW())>DAYOFYEAR(DATE_SUB(birthdate,INTERVAL7DAY))|AND|DAYOFYEAR(NOW())DAYOFYEAR(birthdate)7|AND|DAYOFYEAR(NOW())

  • 6/12/2014 MySQL::MySQL5.0ReferenceManual::12.7DateandTimeFunctions

    http://dev.mysql.com/doc/refman/5.0/en/dateandtimefunctions.html 28/42

    Thefollowingreturns1fortheweekbetween20031229and20040104:

    |SELECT|WEEK('20031229',3),|WEEK('20040104',3)

    PostedbyMartinMinkaonJanuary2520075:23pm [Delete][Edit]

    Icreatedthisfunctiontocalculate"workingday"differenceoftwodates.Ifyouhavetablewithlistofholidaysyoumayuncommentpartinthisfunctiontoexcludedaysofholidaysalso.

    DELIMITER$$

    DROPFUNCTIONIFEXISTS`workdaydiff`$$

    CREATEDEFINER=`root`@`%`FUNCTION`workdaydiff`(bdate,adate)RETURNSint(11)DETERMINISTICCOMMENT'workingdaydifferencefor2dates'BEGINDECLAREfreedaysintSETfreedays=0

    SET@x=DATEDIFF(b,a)IF@x5THENSET@w1=0ELSESET@w1=6@w1ENDIF/*daysinlastweek*/SET@wx2=WEEKDAY(b)+1SET@w2=@wx2IF@w2>5THENSET@w2=5ENDIF/*summary*/SET@weeks=(@x@wx1@wx2)/7SET@noweekends=(@weeks*5)+@w1+@w2/*UncomentthisifyouwantexcludealsohollidaysSELECTcount(*)INTOfreedaysFROMhollidayWHEREd_dayBETWEENaANDbANDWEEKDAY(d_day)=TIME_TO_SEC(first_date),TIME_TO_SEC(last_date)TIME_TO_SEC(first_date),86400+(TIME_TO_SEC(last_date)TIME_TO_SEC(first_date)))FROMtable

    Thiswillreturnthetimebetweenthelast_dateandthefirstdate,takingintoaccountthevalueswherefirst_dateandlast_dateareondifferentdays.

    PostedbyWillJaspersonMay220073:58pm [Delete][Edit]

    NOTE:DateFormatcannotbeusedtoformataTimeDiffcalculation.

    Example:SELECTDATE_FORMAT(TIMEDIFF(`appointment_start`,`appointment_end`),'%H:%i:%s'))ASdurationFROMappointments

    CorrectSyntax:SELECTTIMEDIFF(`appointment_start`,`appointment_end`)ASdurationFROMappointments

    (TestedonMySQL4.1.20)

    Postedby[namewithheld]onMay3120075:11pm [Delete][Edit]

    Mypickonbirthdaysremainders:

    selectdate_format(date,"%d/%m"),DAYOFYEAR(CURDATE()),DAYOFYEAR(date)fromtablewhereDAYOFYEAR(date)betweenDAYOFYEAR(CURDATE())15andDAYOFYEAR(CURDATE())+15orderbydate_format(date,"%d/%m/%Y")

    GabrielRegulyhttp://ppgr.com.br

    PostedbyEjectDisconJune11200710:53am [Delete][Edit]

    AsmentionedaboveSTR_TO_DATE()isavailableasofMySQL4.1.1.

  • 6/12/2014 MySQL::MySQL5.0ReferenceManual::12.7DateandTimeFunctions

    http://dev.mysql.com/doc/refman/5.0/en/dateandtimefunctions.html 29/42

    ThisfunctioncanbeusefulifyouaregroupingrowsbyWeekofYearandthenwanttoproduceatablewith"WeekCommencing"asthepointsonyourXaxis.

    Sowhatdoyoudoifyou'recodeshopisusingpre4.1?

    Here'swhatIdid.Ihaveatableofeventshappeningonadatetime.Iwantedaneventcountbyweekwiththedateofthestartoftheweek,assumingtheweekstartsMonday.

    Ihaveexploitedthegroupbyfunctiontoextracttheminimumdatetimevaluewhichinmycaseisguaranteedtobeatleastoncedaily.

    Thiswillnotworkifyourdataisnotbeinginjecteddaily!

    selectcount(*)as'count',date_format(min(added_on),'%Y%M%d')as'weekcommencing',date_format(added_on,'%Y%u')as'week'fromsystemwhereadded_on>='20070516'groupbyweekorderby3desc

    ++++|count|weekcommencing|week|++++|88|2007June04|200723||276|2007May28|200722||275|2007May21|200721||160|2007May16|200720|++++

    Hopethatsusefulforsomeone!

    ImranChaudhry

    PostedbyAndrewHollowayonAugust820076:01pm [Delete][Edit]

    Duetoabuginmysqlversionspriorto5.0.36,thereisaproblemwhenperformingmultipleSEC_TO_TIMEconversionsandthereareintermediatenullvalues.Itwillturntheresultsafterthefirstnullintonullvalues.

    Forexample:ifyouhaveatable(date_diff)asfollows:

    |id|time1|time2|++++|1|9:30:05|(null)||2|10:05:07|10:05:17||3|11:00:03|11:01:00||4|12:05:11|(null)|

    andyourunaquery:

    selectsec_to_time(time_to_sec(time1)time_to_sec(time2))asdifffromdate_diff

    Youwillseeresultsasso:

    |diff|++|00:00:00||(null)||(null)||(null)|

    Andaqueryexcludingid1willresultin:

    |diff|++|00:00:10||00:00:57||00:00:00|

    Aworkaroundwouldbetouseacasestatement:

    selectcasewhenisnull(time_to_sec(time1)time_to_sec(time2))thennullelsesec_to_time(time_to_sec(time1)time_to_sec(time2))endasdifffromdate_diff

    Or,upgradetoamysqlversionincludingthisbugfix(#25643).

    PostedbyMarcelBrouilletonAugust1620071:37pm [Delete][Edit]

    Todisplaythedateofthemondayprecedingagivenday,BryanDonovansuggestedthefollowing:>SELECTDISTINCT(STR_TO_DATE(CONCAT(YEARWEEK(starttime),'1'),'%x%v%w'))>FROMtest_events

    Infact,youneedtobeconsistentinthetypeofweeksyouuse.TheabovewouldtellyouthattheMondayJuly162007ispartoftheweekstarting...MondayJuly92007!Thiscomesfromweekdefinitionambiguities(seeWEEK()above).Topreventthis,specifythemodeonYEARWEEKtobeMondaybased:payattentiontotheextraparametertothefunctionYEARWEEK)below

  • 6/12/2014 MySQL::MySQL5.0ReferenceManual::12.7DateandTimeFunctions

    http://dev.mysql.com/doc/refman/5.0/en/dateandtimefunctions.html 30/42

    ++|DATE_FORMAT('20070716',"%W")|++|Monday|++++|STR_TO_DATE(CONCAT(YEARWEEK('20070716'),'1'),'%x%v%w')|++|20070709|++++|STR_TO_DATE(CONCAT(YEARWEEK('20070716',1),'1'),'%x%v%w')|++|20070716|++

    Onewouldexpectthatdefault_week_formathasthesameeffectonWEEKDAY()thanithasonWEEK()andthatsettingthisvariableto1or3wouldsuffice.No,asofMysql5.0.26itseemstohavenoeffect:

    SETdefault_week_format=1SELECTSTR_TO_DATE(CONCAT(YEARWEEK('20070716'),'1'),'%x%v%w')

    ++|20070709|++

    PostedbyDaveHoldenonSeptember6200712:43am [Delete][Edit]

    ANNIVERSARIESARETRICKY!

    ForversionsofMySQLpreviousto4.1itisquitedifficulttodetermineifadatefield'sanniversarydatefallswithinaspecifieddaterange.Dayofyearcalculationsfailbecauseofleapyearsandthepossibilitythatthedaterangeyouhavespecifiedspansayearboundary.HereiswhatIhavecomeupwith.HopefullyitcansavesomeonetheheadacheandGoogleFeverIhadtogothroughtocomeupwithit.

    **SOMESELECTSTATEMENT...**WHERE((month(Date)BETWEENmonth('[MyStartDate]')ANDmonth('[MyEndDate]')ANDmonth('[MyStartDate]')=dayofmonth('[MyStartDate]')ANDmonth(Date)=month('[MyStartDate]')ORdayofmonth(Date)month('[MyStartDate]')ANDmonth(date)month('[MyEndDate]')AND(dayofmonth(Date)>=dayofmonth('[MyStartDate]')ANDmonth(Date)=month('[MyStartDate]')ORdayofmonth(Date)month('[MyStartDate]')ORmonth(Date)

  • 6/12/2014 MySQL::MySQL5.0ReferenceManual::12.7DateandTimeFunctions

    http://dev.mysql.com/doc/refman/5.0/en/dateandtimefunctions.html 31/42

    Birthdayreminder

    Thenextbirthday(includingtoday!)iswhenthepersonis1yearolderthanhe/shewasyesterday.SoIuse

    mysql>selectname,birthday,adddate(birthday,intervaltimestampdiff(year,adddate(birthday,interval1day),current_date)+1year)asnext_bdfrompersonorderbynext_bd

    ++++|name|birthday|next_bd|++++|FooToday|19701012|20071012||Bar1|19901225|20071225||Bar2|20000125|20080125||Foo|19800229|20080229|++++

    4rowsinset(0.00sec)

    mysql>selectname,birthday,adddate(birthday,intervaltimestampdiff(year,adddate(birthday,interval1day),'20081012')+1year)asnext_bdfrompersonorderbynext_bd

    ++++|name|birthday|next_bd|++++|FooToday|19701012|20081012||Bar1|19901225|20081225||Bar2|20000125|20090125||Foo|19800229|20090228|++++

    4rowsinset(0.00sec)

    Asyoucansee,thisisalsoworkingforleapyears.

    BTW:Is"20080229"plus1year"really"20090228"?)

    PostedbyAaronDavidsononDecember620074:05pm [Delete][Edit]

    Totestifadateisavaliddate:

    SET@testdate="20070229"SELECTIF(@testdate=DATE_ADD(DATE_ADD(@testdate,INTERVAL1DAY),INTERVAL1DAY),TRUE,FALSE)

    Returns0(false)

    SET@testdate="20080229"SELECTIF(@testdate=DATE_ADD(DATE_ADD(@testdate,INTERVAL1DAY),INTERVAL1DAY),TRUE,FALSE)

    Returns1(true)

    PostedbyMohamedInfiyazZafferKhalidonDecember1220071:45pm [Delete][Edit]

    Findingadatebeforeagivennumberofdays

    Often,forcertainapplications,weneedtosubtractsomedaysfromagivendatetofindanotherdate.Forexample,inalibrary,weneedtogo21daysbehindfromthecurrentdateandlistthebooksthatweretakenbeforethatdate.Thiswouldbetheoverduelist.

    HereisasimpleSQLstatement.Thistypeofuseispracticallyessentialtomostapps.

    SELECTSUBDATE('20071212',INTERVAL3DAY)

    Thelineabovewillgivetheanswer2007129.Toexplainitfurther,thefunctionSUBDATEreturnsadateaftersubtractingaspecifiedduration.Inourexample,thedurationis3days.ToindicatethatwearedealingwithDAYS,weusethetermINTERVAL.Sothefunctionabovecanbeexplainedaswhatisthedate,threedaysbeforetoday?

    Nowifyouwanttofindthedate20daysbeforeTODAYorthecurrentsystemdate,thisiswhatyoushoulddo:

    SELECTSUBDATE(CURRENT_DATE,INTERVAL20DAY)

    Inthestatementabove,weareusingoneoftheMySQLconstantsthatholdthecurrentdateontheserver.Wecount20daysbackandgettheanswerasaresult.

    Happycoding.

    Khalid(itsols)

    PostedbyMarcusMatosonJanuary820081:02pm [Delete][Edit]

    Important:ItshouldbeknownthatMySQL>=5.0.42silentlychangesthebehaviorofcomparingaDATEcolumntoNOW().

    See:http://bugs.mysql.com/bug.php?id=28929

    ThisbreaksmanythingssincenowqueriesusingWHEREdatecol=NOW()willreturnNULLwherepreviouslyitwouldreturnresults.

    UseCURDATE()instead.I'mhavingtogobackthroughyearsofcodetofixthis.

    PostedbyTomaszKopeconJanuary1720081:41pm [Delete][Edit]

    referingtothedocumentsectiontellingaboutintervalsindate_add/date_subfunctionsdescribingexample:SELECTDATE_ADD('19990101',INTERVAL6/4HOUR_MINUTE)Onecanavoidfallingintotrapsimplyenclosinginterval6/4intoquotationmarkssothequerywillbelooklikethis:SELECTDATE_ADD('19990101',INTERVAL'6/4'HOUR_MINUTE)Thiscasetheintervalwillbeconsideredasregularstringandnocalculationwillbeperformedbeforepassingasargument

    PostedbyMohamedMahironJanuary2320086:31am [Delete][Edit]

  • 6/12/2014 MySQL::MySQL5.0ReferenceManual::12.7DateandTimeFunctions

    http://dev.mysql.com/doc/refman/5.0/en/dateandtimefunctions.html 32/42

    EarlierIusedtimediffinwhereclauseworkedperfectlybutdon'tknowwhyitisnotworkingnowespeciallyaftercpuusageexceedsin*intwodifferentsharedhosting*

    querylike

    select*fromtablewheretimediff(sysdate(),datetimecolumn)

  • 6/12/2014 MySQL::MySQL5.0ReferenceManual::12.7DateandTimeFunctions

    http://dev.mysql.com/doc/refman/5.0/en/dateandtimefunctions.html 33/42

    "

    DELIMITER$$

    DROPFUNCTIONIFEXISTS`effectiveworkdays`$$

    CREATEDEFINER=`myUserName`@`myHost`FUNCTION`effectiveworkdays`(STARTDATEdate,ENDDATEdate,WORKABLE1integer,WORKABLE2integer,WORKABLE3integer,WORKABLE4integer,WORKABLE5integer,WORKABLE6integer,WORKABLE7integer)RETURNSint(11)DETERMINISTICCOMMENT'effectiveworkingdayfor2dates'BEGINDECLAREDAYCOUNTintDECLAREHOLIDAYCOUNT,HOLIDAYSintDECLARESTARTDAYSintDECLAREENDDAYSint

    SETDAYCOUNT=0SETHOLIDAYCOUNT=0SETHOLIDAYS=0SETSTARTDAYS=TO_DAYS(STARTDATE)1SETENDDAYS=TO_DAYS(ENDDATE)

    IF(STARTDAYSgetRequestParameter("id"))

  • 6/12/2014 MySQL::MySQL5.0ReferenceManual::12.7DateandTimeFunctions

    http://dev.mysql.com/doc/refman/5.0/en/dateandtimefunctions.html 34/42

    $tmp=EmployeePeer::doSelect($c)$employee=$tmp[0]

    $schedule=$employee>getEmploymentContract()>getWorkSchedule()

    $workableFirst=$schedule>getWorkableFirst()==1?1:0$workableSecond=$schedule>getWorkableSecond()==1?1:0$workableThird=$schedule>getWorkableThird()==1?1:0$workableFourth=$schedule>getWorkableFourth()==1?1:0$workableFifth=$schedule>getWorkableFifth()==1?1:0$workableSixth=$schedule>getWorkableSixth()==1?1:0$workableSeventh=$schedule>getWorkableSeventh()==1?1:0

    $query="SELECTsum(effectiveworkdays2(vrs.confirmed_from,vrs.confirmed_to,$workableFirst,$workableSecond,$workableThird,$workableFourth,$workableFifth,$workableSixth,$workableSeventh))ASsumFROMapp_vacation_responsesvrsLEFTJOINapp_vacation_requestsvrqONvrs.request_id=vrq.vacation_idWHEREvrq.requested_by=".$employee_id."ANDvrs.confirmed_from>='".date('Y')."0101'ANDvrs.confirmed_to

  • 6/12/2014 MySQL::MySQL5.0ReferenceManual::12.7DateandTimeFunctions

    http://dev.mysql.com/doc/refman/5.0/en/dateandtimefunctions.html 35/42

    Notethatthe"yesterday"checkoccursbeforethe"hours"check.Thisisintentionalsothathourswillonlybeshownifthemodificationoccurredduringthecurrentday.

    Hopethisisusefulforsomeoneelse!

    PostedbySimonStefanonJuly3120086:29am [Delete][Edit]

    Hereisaselectionforabirthdayreminderwith2daysbefore(INTERVAL2DAY):

    selectid,angajat_id,data_nasterefrominfo_angajatwhereDATE_ADD(date(concat(YEAR(data_nastere),"",MONTH(NOW()),"",DAYOFMONTH(NOW()))),INTERVAL2DAY)=data_nastere

    PostedbyChandruNonAugust14200811:59am [Delete][Edit]

    Tofindthestartandendofamonthyoucanusethefollowingqueries:Lastdayofcurrentmonth:SELECTLAST_DAY(now())LastdayofPreviousmonthSELECTLAST_DAY(now()interval1month)Firstdayofcurrentmonth:SELECTconcat(date_format(LAST_DAY(now()),'%Y%m'),'01')Firstdayofpreviousmonth:SELECTconcat(date_format(LAST_DAY(now()interval1month),'%Y%m'),'01')

    PostedbyMatiasThayeronOctober920082:22pm [Delete][Edit]

    Hi,hereisaMySQL(5)functiontovalidateadate,informatYYYYMMDD(example:"selectisDate(20080229)").Thisfunctioninclude"leapyear"validation.Itrytosimulate"isdate()"functionofSqlServer.

    DELIMITER$$CREATEFUNCTION`isDate`(svarchar(100))RETURNSdecimal(8)BEGIN

    /*validafechasuponiendoqueesingresadocomo"20081228"(largo8)*/declaretpintdeclarebisiestoint

    sets=trim(s)/*realizamosvalidacionesgenerales*/iftrim(s)=0andlength(trim(s))8thenreturn0/*fechainvalida*/endif

    ifsubstr(s,1,4)notbetween0and9999thenreturn0/*annoinvalido*/endif

    ifsubstr(s,5,2)notbetween1and12thenreturn0/*mesinvalido*/endif

    /*vemossiesbisiestoelano*/setbisiesto=0ifsubstr(s,1,4)mod400=0thensetbisiesto=1elseifsubstr(s,1,4)mod100=0thensetbisiesto=0elseifsubstr(s,1,4)mod4=0thensetbisiesto=1elsesetbisiesto=0endif

    settp=(casewhensubstr(s,7,2)0then1else0end)

    returntp

    END$$

    PostedbyParisAlexonNovember19200812:37am [Delete][Edit]

    I'vealwaysfinditusefultobeabletofindoutthenumberofrecordscreatedonamonthlybasis.ThisSELECTstatementdoesthejobbyformattingadatefieldusingDATE_FORMAT()andgroupittoseedatabytheyearandmonth.

    SELECTDATE_FORMAT(creationDate,'%Y%m')ASmonth,COUNT(*)AStotalFROMmyTableGROUPBYmonthORDERBYtotalDESCLIMIT5

    +++|month|total|+++|200607|485||200608|179||200810|96||200806|89||200801|84|+++

  • 6/12/2014 MySQL::MySQL5.0ReferenceManual::12.7DateandTimeFunctions

    http://dev.mysql.com/doc/refman/5.0/en/dateandtimefunctions.html 36/42

    5rowsinset(0.00sec)

    TheORDERBYandLIMITisoptional,tofurtherfiltertheselectstatement.

    Regards,Alexhttp://www.loveromehotel.com/

    PostedbyJooMarquesGomesonFebruary620093:46pm [Delete][Edit]

    Getfirstdayofcurrentweek.WhenfirstdayisaSunday:

    selectdate_sub(curdate(),intervaldayofweek(curdate())1day)

    Joao

    PostedbyLoretoParisionFebruary8200911:44am [Delete][Edit]

    Ifoundfunctionstr_to_date()veryusefulwhenhaving"humanreadable"dateformatsandyouwanttousetheORDERBYclausetosortthetablebythosefields:

    Supposedwehaveafields'published_date'likethis:

    SELECT[,]published_date[,]

    ++|published_date|++|Fri,23Jan200900:00:000800||Mon,26Jan200902:21:090800||Fri,23Jan200916:00:000800||Thu,22Jan200915:00:000800||Thu,29Jan200902:00:270800|++

    NowwetrytoORDERBYpublished_dateDESC,resultingin:

    SELECT[,]published_date[,]ORDERBYpublished_dateDESC[]

    ++|published_date|++|Wed,21Jan200918:30:000800||Wed,21Jan200911:30:360800||Tue,27Jan200900:09:460800||Tue,20Jan200916:00:000800||Tue,13Jan200916:00:000800|++

    Asyoucanseethesetisnotwellsorted,Sosimplyusethestr_to_datefunwiththesyntax:

    SELECT[,]str_to_date(published_date,'%a,%d%b%Y%H:%i:%s')asmy_published_date[,]ORDERBYmy_published_dateDESC[]

    Sowe'llhave:

    ++|my_published_date|++|2009013011:39:04||2009012910:26:51||2009012902:00:27||2009012700:09:46||2009012608:10:45|++

    andthesetisnowsortedwell.

    PostedbyStevenCopleyonMarch2620091:00am [Delete][Edit]

    Thiswillgiveweekdays(everythingminusweekends)between2dates:

    SELECT(floor(datediff('20090111','20090101')/7)*5)+CASEdayofweek('20090101')WHEN1THENmod(datediff('20090111','20090101'),7)2WHEN7THENmod(datediff('20090111','20090101'),7)1ELSELEAST(7dayofweek('20090101'),mod(datediff('20090111','20090101'),7))END

    PostedbyJoshuaLeboonMay1920097:32pm [Delete][Edit]

    Anotherwaytofindthelastdayofamonth(withoutLAST_DAY),givenadatewithinthatmonth:

    selectdate_sub(concat(date_format(date_add(curdate(),interval1month),'%Y%m'),'01'),INTERVAL1DAY)

    orforaspecificday:

    selectdate_sub(concat(date_format(date_add('20080218',interval1month),'%Y%m'),'01'),INTERVAL1DAY)

  • 6/12/2014 MySQL::MySQL5.0ReferenceManual::12.7DateandTimeFunctions

    http://dev.mysql.com/doc/refman/5.0/en/dateandtimefunctions.html 37/42

    walkstothefirstofthefollowingmonth,thensubtracts1day

    PostedbyDanielBersteinonJune2320094:01pm [Delete][Edit]

    TofindfuturedateinXbusinessdays,tookmeawhilebuthereitiswithoutusingstoreprocedures,insteadIcomputethenumberofweekendsbetweentheinitialdateanddate+Xdays,adjustfortheweekenddays.Itsimplementedasaderivedtabletoeasyjoinswithrealtables.

    /*Theinitialdatefromwhentostartcounting*/SET@start:=NOW()/*Numberofbusinessdays*/SET@days:=4/*Thequery*/SELECTcalendar.`Result`FROM(/*Ifinitialdateisonaweekend,adjusttofirstbusinessday*/SELECT@start:=@start+INTERVALCASEWHENDAYOFWEEK(@start)=7THEN2WHENDAYOFWEEK(@start)=1THEN1ELSE0ENDDAY`First`,@days`Days`,/*Numberofestimatedbusinessweeks*/@weekends:=DATEDIFF(@start+INTERVAL@daysDAY,@start)DIV5`Weekends`,/*Estimatedtargetdatebasednumberofweekends*/@guess:=@start+INTERVAL@days+2*@weekendsDAY`Guess`,/*Adjustresultdateifitfallsonaweekend*/IF(DAYOFWEEK(@guess)=1,@guess+INTERVAL1DAY,IF(DAYOFWEEK(@guess)=7,@guess+INTERVAL+2DAY,@guess))`Result`)calendar

    PostedbyMartinStjernholmonAugust320092:28pm [Delete][Edit]

    ToexpandabitonthenotebyJeffreyFriedlonOctober3120049:05am:

    ThemanualstatesthatFROM_UNIXTIME(UNIX_TIMESTAMP(...))doesn'tmapbacktothesameformatteddate.Whatalsoshouldbestatedisthatthereverseisnottrueeither.

    UNIX_TIMESTAMP(ts)wheretsisaTIMESTAMPcolumnreturnstheunixtimestampstoredinitwithoutconversionto/fromaformatteddatestring.ThatavoidstroublewithtimezonesandDSToverlapsetc.

    However,whenthecolumntsissetthroughFROM_UNIXTIME(n),it(apparently)formatstheunixtimestampasastringwhichisthenparsedbacktoatimestampagain.Theformattingandtheparsingisdonewiththesametimezone,sothetimezoneoffsetsgenerallycancelthemselvesout.TheexceptionisifthetimezoneusesDSTandthetimestampisintheoverlappinghourinthefallwhengoingfromsummertimetonormaltime.

    E.g.iftheactivetimezoneontheconnectionisCentralEuropeanTime,whichusesDST,thensetting1130630400(Sun30Oct20052:00:00CEST)through

    INSERTINTOfooSETts=FROM_UNIXTIME(1130630400)

    actuallysetsthetscolumnto1130634000(Sun30Oct20052:00:00CET),i.eonehourlater.

    Theonlywayaroundthatproblemisapparentlytoensurethatthetimezoneusedontheconnectionisonewhichdoesn'tuseDST.E.g.UTCisareasonablechoice,whichcanbesetontheconnectionthrough"SETtime_zone='+00:00'".

    PostedbyWernerKremeronAugust420093:06pm [Delete][Edit]

    IimplementedawellknownalgorithmfromanEnglishstandardsorganisation(I'veforgottenexactlywho).

    forthecalculateeastersundayiusedfollowingfunction:

    DELIMITER$$

    USE`pczeitdb`$$

    DROPFUNCTIONIFEXISTS`fneastern`$$

    CREATEDEFINER=`wkroot`@`%`FUNCTION`fneastern`(iYearINT)RETURNSDATEDETERMINISTICBEGINSET@iD=0,@iE=0,@iQ=0,@iMonth=0,@iDay=0

    SET@iD=25511*(iYear%19)SET@iD=IF(@iD>50,(@iD21)%30+21,@iD)SET@iD=@iDIF(@iD>48,1,0)SET@iE=(iYear+FLOOR(iYear/4)+@iD+1)%7SET@iQ=@iD+7@iEIF@iQ

  • 6/12/2014 MySQL::MySQL5.0ReferenceManual::12.7DateandTimeFunctions

    http://dev.mysql.com/doc/refman/5.0/en/dateandtimefunctions.html 38/42

    ThefollowingwilloutputtheproperfullhouroffsetfromUTC:

    SELECTTIME_FORMAT(NOW()UTC_TIMESTAMP(),'%H%i')AStz_offset

    PostedbyJohnDoeonDecember21200911:56am [Delete][Edit]

    ThisisaSQLstatementtolistallthepeoplewhosebirthdayiscomingupinthenextcoupleofweeks,payingattentiontoyear'send:

    SET@YEAR=EXTRACT(YEARFROMCURDATE())

    SELECTnameFROMmytableWHEREDATEDIFF(DATE_FORMAT(birthdate,CONCAT(@YEAR,"%m%d")),CURDATE())BETWEEN0AND15ORDATEDIFF(DATE_FORMAT(birthdate,CONCAT(@YEAR+1,"%m%d")),CURDATE())BETWEEN0AND15

    PostedbyRickWellmanonJanuary520101:03am [Delete][Edit]

    MuchappreciationtoStevenCopley'spostconcerningweekdays[sincethatiswhatIwaslookingfor]butIthinkheusedthedayofweek()functionwherehemeanttousetheweekday()functionintheLEAST()clause.i.e.

    Thiswillgiveweekdays(everythingminusweekends)between2dates:

    SELECT(floor(datediff('20090111','20090101')/7)*5)+CASEdayofweek('20090101')WHEN1THENmod(datediff('20090111','20090101'),7)2WHEN7THENmod(datediff('20090111','20090101'),7)1ELSELEAST(7weekday('20090101'),mod(datediff('20090111','20090101'),7))END

    PostedbyRobertEiseleonJanuary1520104:15pm [Delete][Edit]

    Idiscussedthetopicofagecalculationtwoweeksbeforeonmyblog:http://www.xarg.org/2009/12/agecalculationwithmysql/

    IfoundaverysmartsolutiontocalculatetheagefromaDATEvalue:

    CREATEFUNCTIONgetage(BDAYDATE)RETURNSTINYINTUNSIGNEDRETURNYEAR(FROM_DAYS(DATEDIFF(NOW(),BDAY)))

    Tocalculatesomeonesnextbirthday,Iwroteasimilarfunction:

    CREATEDFUNCTIONnextbday(bdayDATE)RETURNSDATERETURNDATE_ADD(bday,INTERVALYEAR(FROM_DAYS(DATEDIFF(NOW(),bday)1))+1YEAR)

    PostedbyMichaelCunninghamonJanuary2420104:20pm [Delete][Edit]

    Ipersonallygotstuck,tryingtofeedVBScriptdatesbackintoMySQLastheODBCDriverconvertstheMySQLdatestoVBScript'sversionautomatically.

    ThisisaonelinersolutionforeveryoneusingVBScript(ASP),thatneedstofeedaVBdateintoMySQL.

    Input:REQmodinanydateformatthatVBScriptunderstands(1/1/197012:00:01AM)

    REQmod=year(REQmod)&""&right("0"&month(REQmod),2)&""&right("0"&day(REQmod),2)&""&right("0"&Hour(REQmod),2)&":"&right("0"&Minute(REQmod),2)&":"&right("0"&Second(REQmod),2)

    Output:REQmodwillbestrictlyinMySQLFormat(1970010100:00:01)

    PostedbyD.MeaneaonMay420109:37pm [Delete][Edit]

    TwothingstokeepinmindwhenusingtheTIMESTAMPDIFFfunction:

    1.Thefunctionreturnsatruncatedintegerofthespecifiedunit.ItdoesNOTusetheunittodeterminetheprecisionofthedifferencecalculation.Forexample,youmightexpectSELECTTIMESTAMPDIFF(MONTH,'20100331','20100430')toreturn1,asthedifferencebetween'201003'and'201004'.However,becausethedifference(includingthedays)isnotquiteafullmonth,itreturns0,not1.

    2.Inversion5.0,theunityouspecifydetermineswhetherthecalculationincludesthetimeelements.WhenusingtheYEARorMONTHunits,thefunctionusesthedateelements(year,monthandday)inthecomparison,butignoresthetimeelements.Forexample,SELECTTIMESTAMPDIFF(MONTH,'2010030100:00:00','2010040100:00:00')andSELECTTIMESTAMPDIFF(MONTH,'2010030123:59:59','2010040100:00:00')bothreturn1,whileSELECTTIMESTAMPDIFF(MONTH,'2010030200:00:00','2010040100:00:00')returns0.

    However,ifyouuseDAYastheunit,alldateandtimeelementsareincludedinthecalculation.Thus,SELECTTIMESTAMPDIFF(DAY,'2010032900:00:00','2010033000:00:00')returns1,whileSELECTTIMESTAMPDIFF(DAY,'2010032900:00:01','2010033000:00:00')returns0.

    Inversion5.1,thefunctionincludesthetimeelementsinallcalculations.(Mytestingwasdoneinversions5.0.75and5.1.30)

    Thisfunctionworksfineforcalculationsonthetimepartofatimestampbutforworkingwiththedatepart,ImuchpreferusingtheYEAR,PERIOD_DIFF,orTO_DAYSfunctions.

    PostedbyStoob!onMay1220107:42pm [Delete][Edit]

    IfyouhaveaVARCHARcolumncalled,forexample,`Date`thatcontainsdatedata,butisnotformattedasaMySQLDATEcolumn,youcanconvertitusingMySQL'sSTR_TO_DATEfunction.

    Forinstance,Excelstorescanstoredateslikethis1/31/2010.MySQLusesthis,20100131.

    Step1.CreateacolumnoftypeDATEcalled`MySQLDate`

  • 6/12/2014 MySQL::MySQL5.0ReferenceManual::12.7DateandTimeFunctions

    http://dev.mysql.com/doc/refman/5.0/en/dateandtimefunctions.html 39/42

    Step2.UPDATE`table`SETMySQLDate=(SELECTSTR_TO_DATE(`Date`,'%c/%e/%Y'))

    Alsohereisanothertip.ThereisaLAST_DAY()functionbutnoFIRST_DAY()function.ThishasthesameeffectofFIRST_DAY:itsubtractsamonth,findlastday,andthenadd1day.

    UPDATE`table`SETstart_date=DATE_ADD(LAST_DAY(DATE_SUB(start_date,INTERVAL1MONTH)),INTERVAL1DAY)

    PostedbySankarRamanathanonJuly220106:50am [Delete][Edit]

    Tofindnumberofdaysinamonth.

    SELECTDAY(LAST_DAY('2010021'))orSELECTDAYOFMONTH(LAST_DAY('20100201'))

    Postedbynicolaslumbre