diff --git a/sc/inc/helpids.h b/sc/inc/helpids.h
index 5eec0d1..e9638b3 100644
--- a/sc/inc/helpids.h
+++ b/sc/inc/helpids.h
@@ -295,6 +295,7 @@
 // Analysis Addin Functions (max.120) ----------------------------------------
 #define HID_AAI_FUNC_WORKDAY                                    "SC_HID_AAI_FUNC_WORKDAY"
 #define HID_AAI_FUNC_YEARFRAC                                   "SC_HID_AAI_FUNC_YEARFRAC"
+#define HID_AAI_FUNC_DATEDIF                                    "SC_HID_AAI_FUNC_DATEDIF"
 #define HID_AAI_FUNC_EDATE                                      "SC_HID_AAI_FUNC_EDATE"
 #define HID_AAI_FUNC_WEEKNUM                                    "SC_HID_AAI_FUNC_WEEKNUM"
 #define HID_AAI_FUNC_EOMONTH                                    "SC_HID_AAI_FUNC_EOMONTH"
diff --git a/sc/source/core/tool/addinhelpid.cxx b/sc/source/core/tool/addinhelpid.cxx
index 67bae51..5ecb7b0 100644
--- a/sc/source/core/tool/addinhelpid.cxx
+++ b/sc/source/core/tool/addinhelpid.cxx
@@ -66,6 +66,7 @@ const ScUnoAddInHelpId pAnalysisHelpIds[] =
     { "getCouppcd"                  , HID_AAI_FUNC_COUPPCD          },
     { "getCumipmt"                  , HID_AAI_FUNC_CUMIPMT          },
     { "getCumprinc"                 , HID_AAI_FUNC_CUMPRINC         },
+    { "getDateDif"                  , HID_AAI_FUNC_DATEDIF          },
     { "getDec2Bin"                  , HID_AAI_FUNC_DEC2BIN          },
     { "getDec2Hex"                  , HID_AAI_FUNC_DEC2HEX          },
     { "getDec2Oct"                  , HID_AAI_FUNC_DEC2OCT          },
diff --git a/sc/source/core/tool/odffmap.cxx b/sc/source/core/tool/odffmap.cxx
index 379ccf1..2595857 100644
--- a/sc/source/core/tool/odffmap.cxx
+++ b/sc/source/core/tool/odffmap.cxx
@@ -43,6 +43,7 @@ ScCompiler::AddInMap ScCompiler::maAddInMap[] =
     { "ORG.OPENOFFICE.ROT13", "ROT13", false, "com.sun.star.sheet.addin.DateFunctions.getRot13", "COM.SUN.STAR.SHEET.ADDIN.DATEFUNCTIONS.GETROT13" },
     { "WORKDAY", "WORKDAY", false, "com.sun.star.sheet.addin.Analysis.getWorkday", "COM.SUN.STAR.SHEET.ADDIN.ANALYSIS.GETWORKDAY" },
     { "YEARFRAC", "YEARFRAC", false, "com.sun.star.sheet.addin.Analysis.getYearfrac", "COM.SUN.STAR.SHEET.ADDIN.ANALYSIS.GETYEARFRAC" },
+    { "DATEDIF", "DATEDIF", false, "com.sun.star.sheet.addin.Analysis.getDateDif", "COM.SUN.STAR.SHEET.ADDIN.ANALYSIS.GETDATEDIF" },
     { "EDATE", "EDATE", false, "com.sun.star.sheet.addin.Analysis.getEdate", "COM.SUN.STAR.SHEET.ADDIN.ANALYSIS.GETEDATE" },
     { "WEEKNUM", "WEEKNUM_ADD", false, "com.sun.star.sheet.addin.Analysis.getWeeknum", "COM.SUN.STAR.SHEET.ADDIN.ANALYSIS.GETWEEKNUM" },
     { "EOMONTH", "EOMONTH", false, "com.sun.star.sheet.addin.Analysis.getEomonth", "COM.SUN.STAR.SHEET.ADDIN.ANALYSIS.GETEOMONTH" },
diff --git a/sc/source/filter/oox/formulabase.cxx b/sc/source/filter/oox/formulabase.cxx
index 934ff8c..c955f1a 100644
--- a/sc/source/filter/oox/formulabase.cxx
+++ b/sc/source/filter/oox/formulabase.cxx
@@ -640,6 +640,7 @@ static const FunctionData saFuncTableBiff4[] =
     { "MULTINOMIAL",            "MULTINOMIAL",          474,    NOID,   1,  MX, V, { RX }, FUNCFLAG_EXTERNAL },
     { "LCM",                    "LCM",                  475,    NOID,   1,  MX, V, { RX }, FUNCFLAG_EXTERNAL },       // Calc: builtin and add-in
     { "FVSCHEDULE",             "FVSCHEDULE",           476,    NOID,   2,  2,  V, { RR, RX }, FUNCFLAG_EXTERNAL },
+    { "DATEDIF",                "DATEDIF",              485,    NOID,   3,  3,  V, { RR }, FUNCFLAG_EXTERNAL },
 
     // *** macro sheet commands ***
 
diff --git a/sc/util/hidother.src b/sc/util/hidother.src
index 363e08c..5340021 100644
--- a/sc/util/hidother.src
+++ b/sc/util/hidother.src
@@ -377,6 +377,7 @@ hidspecial HID_FUNC_BITLSHIFT       { HelpID = HID_FUNC_BITLSHIFT; };
 
 hidspecial HID_AAI_FUNC_WORKDAY     { HelpID = HID_AAI_FUNC_WORKDAY; };
 hidspecial HID_AAI_FUNC_YEARFRAC    { HelpID = HID_AAI_FUNC_YEARFRAC; };
+hidspecial HID_AAI_FUNC_DATEDIF     { HelpID = HID_AAI_FUNC_DATEDIF; };
 hidspecial HID_AAI_FUNC_EDATE       { HelpID = HID_AAI_FUNC_EDATE; };
 hidspecial HID_AAI_FUNC_WEEKNUM     { HelpID = HID_AAI_FUNC_WEEKNUM; };
 hidspecial HID_AAI_FUNC_EOMONTH     { HelpID = HID_AAI_FUNC_EOMONTH; };
diff --git a/scaddins/idl/com/sun/star/sheet/addin/XAnalysis.idl b/scaddins/idl/com/sun/star/sheet/addin/XAnalysis.idl
index 1cb0018..f607944 100644
--- a/scaddins/idl/com/sun/star/sheet/addin/XAnalysis.idl
+++ b/scaddins/idl/com/sun/star/sheet/addin/XAnalysis.idl
@@ -60,6 +60,11 @@ module addin
                     [in] long StartDate, [in] long EndDate, [in] any Mode )
             raises( com::sun::star::lang::IllegalArgumentException );
 
+        /// datedif.
+        long getDateDif(
+                    [in] long StartDate, [in] long EndDate, [in] string Format )
+            raises( com::sun::star::lang::IllegalArgumentException );
+
         /// edate.
         long getEdate(
                     [in] com::sun::star::beans::XPropertySet xOptions,
diff --git a/scaddins/source/analysis/analysis.cxx b/scaddins/source/analysis/analysis.cxx
index e62265f..7b3b892 100644
--- a/scaddins/source/analysis/analysis.cxx
+++ b/scaddins/source/analysis/analysis.cxx
@@ -587,6 +587,13 @@ double SAL_CALL AnalysisAddIn::getYearfrac( constREFXPS& xOpt,
 }
 
 
+long SAL_CALL AnalysisAddIn::getDateDif( sal_Int32 nStartDate, sal_Int32 nEndDate, const STRING& aFormat ) THROWDEF_RTE_IAE
+{
+    long lRet = GetDateDif( nStartDate, nEndDate, aFormat );
+    RETURN_FINITE( lRet );
+}
+
+
 sal_Int32 SAL_CALL AnalysisAddIn::getEdate( constREFXPS& xOpt, sal_Int32 nStartDate, sal_Int32 nMonths ) THROWDEF_RTE_IAE
 {
     sal_Int32 nNullDate = GetNullDate( xOpt );
diff --git a/scaddins/source/analysis/analysis.hrc b/scaddins/source/analysis/analysis.hrc
index 7b5b94f..9ca5ee71 100644
--- a/scaddins/source/analysis/analysis.hrc
+++ b/scaddins/source/analysis/analysis.hrc
@@ -131,6 +131,7 @@
 #define ANALYSIS_Couppcd                    (ANALYSIS_FUNCDESC_START+90)
 #define ANALYSIS_Coupnum                    (ANALYSIS_FUNCDESC_START+91)
 #define ANALYSIS_Fvschedule                 (ANALYSIS_FUNCDESC_START+92)
+#define ANALYSIS_DateDif                    (ANALYSIS_FUNCDESC_START+93)
 
 
 #define ANALYSIS_FUNCNAME_START             (1)
@@ -228,6 +229,7 @@
 #define ANALYSIS_FUNCNAME_Couppcd           (ANALYSIS_FUNCNAME_START+90)
 #define ANALYSIS_FUNCNAME_Coupnum           (ANALYSIS_FUNCNAME_START+91)
 #define ANALYSIS_FUNCNAME_Fvschedule        (ANALYSIS_FUNCNAME_START+92)
+#define ANALYSIS_FUNCNAME_DateDif           (ANALYSIS_FUNCNAME_START+93)
 
 
 #define ANALYSIS_DEFFUNCNAME_START          (RID_ANALYSIS_DEFFUNCTION_NAMES+1)
@@ -325,6 +327,7 @@
 #define ANALYSIS_DEFFUNCNAME_Couppcd        (ANALYSIS_DEFFUNCNAME_START+90)
 #define ANALYSIS_DEFFUNCNAME_Coupnum        (ANALYSIS_DEFFUNCNAME_START+91)
 #define ANALYSIS_DEFFUNCNAME_Fvschedule     (ANALYSIS_DEFFUNCNAME_START+92)
+#define ANALYSIS_DEFFUNCNAME_DateDif        (ANALYSIS_DEFFUNCNAME_START+93)
 
 
 #endif
diff --git a/scaddins/source/analysis/analysis.hxx b/scaddins/source/analysis/analysis.hxx
index 3e0fd4a..6dd33cf 100644
--- a/scaddins/source/analysis/analysis.hxx
+++ b/scaddins/source/analysis/analysis.hxx
@@ -125,6 +125,7 @@ public:
 
     virtual sal_Int32 SAL_CALL  getWorkday( constREFXPS&, sal_Int32 nStartDate, sal_Int32 nDays, const ANY& aHDay ) THROWDEF_RTE_IAE;
     virtual double SAL_CALL     getYearfrac( constREFXPS&, sal_Int32 nStartDate, sal_Int32 nEndDate, const ANY& aMode ) THROWDEF_RTE_IAE;
+    virtual long SAL_CALL     getDateDif( sal_Int32 nStartDate, sal_Int32 nEndDate, const STRING& aFormat ) THROWDEF_RTE_IAE;
     virtual sal_Int32 SAL_CALL  getEdate( constREFXPS&, sal_Int32 nStartDate, sal_Int32 nMonths ) THROWDEF_RTE_IAE;
     virtual sal_Int32 SAL_CALL  getWeeknum( constREFXPS&, sal_Int32 nStartDate, sal_Int32 nMode ) THROWDEF_RTE_IAE;
     virtual sal_Int32 SAL_CALL  getEomonth( constREFXPS&, sal_Int32 nStartDate, sal_Int32 nMonths ) THROWDEF_RTE_IAE;
diff --git a/scaddins/source/analysis/analysis.src b/scaddins/source/analysis/analysis.src
index bdff7932..516efbe 100644
--- a/scaddins/source/analysis/analysis.src
+++ b/scaddins/source/analysis/analysis.src
@@ -105,6 +105,44 @@ Resource RID_ANALYSIS_FUNCTION_DESCRIPTIONS
         };
     };
 
+    Resource ANALYSIS_DateDif
+    {
+        String 1    // description DateDif
+        {
+            Text [ en-US ] = "Returns the number of whole days, months or years between 'start date' and 'end date'";
+        };
+
+        String 2 // name of parameter 1         DateDif
+        {
+            Text [ en-US ] = "Start date";
+        };
+
+        String 3 // description of parameter 1  DateDif
+        {
+            Text [ en-US ] = "The start date";
+        };
+
+        String 4 // name of parameter 2         DateDif
+        {
+            Text [ en-US ] = "End date";
+        };
+
+        String 5 // description of parameter 2  DateDif
+        {
+            Text [ en-US ] = "The end date";
+        };
+
+        String 6 // name of parameter 3         DateDif
+        {
+            Text [ en-US ] = "Format";
+        };
+
+        String 7 // description of parameter 3  DateDif
+        {
+            Text [ en-US ] = "Format of the result";
+        };
+    };
+
     Resource ANALYSIS_Edate
     {
         String 1    // description Edate
diff --git a/scaddins/source/analysis/analysis_deffuncnames.src b/scaddins/source/analysis/analysis_deffuncnames.src
index 2c67e2c..d990d23 100644
--- a/scaddins/source/analysis/analysis_deffuncnames.src
+++ b/scaddins/source/analysis/analysis_deffuncnames.src
@@ -48,6 +48,15 @@ Resource RID_ANALYSIS_DEFFUNCTION_NAMES
         };
     };
 
+    StringArray ANALYSIS_DEFFUNCNAME_DateDif
+    {
+        ItemList =
+        {
+            < "DATUMDIFFERENZ"; >;
+            < "DATEDIF"; >;
+        };
+    };
+
     StringArray ANALYSIS_DEFFUNCNAME_Edate
     {
         ItemList =
diff --git a/scaddins/source/analysis/analysis_funcnames.src b/scaddins/source/analysis/analysis_funcnames.src
index 47796f3..6302c44 100644
--- a/scaddins/source/analysis/analysis_funcnames.src
+++ b/scaddins/source/analysis/analysis_funcnames.src
@@ -40,6 +40,11 @@ Resource RID_ANALYSIS_FUNCTION_NAMES
         Text [ en-US ] = "YEARFRAC";
     };
 
+    String ANALYSIS_FUNCNAME_DateDif
+    {
+        Text [ en-US ] = "DATEDIF";
+    };
+
     String ANALYSIS_FUNCNAME_Edate
     {
         Text [ en-US ] = "EDATE";
diff --git a/scaddins/source/analysis/analysishelper.cxx b/scaddins/source/analysis/analysishelper.cxx
index c2e17a8..7f678be 100644
--- a/scaddins/source/analysis/analysishelper.cxx
+++ b/scaddins/source/analysis/analysishelper.cxx
@@ -56,6 +56,7 @@ const FuncDataBase pFuncDatas[] =
     //         function name     DOUBLE      STDPAR     # of param  category
     FUNCDATA( Workday,          UNIQUE,     INTPAR,     3,          FDCat_DateTime ),
     FUNCDATA( Yearfrac,         UNIQUE,     INTPAR,     3,          FDCat_DateTime ),
+    FUNCDATA( DateDif,          UNIQUE,     STDPAR,     3,          FDCat_DateTime ),
     FUNCDATA( Edate,            UNIQUE,     INTPAR,     2,          FDCat_DateTime ),
     FUNCDATA( Weeknum,          DOUBLE,     INTPAR,     2,          FDCat_DateTime ),
     FUNCDATA( Eomonth,          UNIQUE,     INTPAR,     2,          FDCat_DateTime ),
@@ -508,7 +509,6 @@ sal_Int32 GetDaysInYear( sal_Int32 nNullDate, sal_Int32 nDate, sal_Int32 nMode )
     }
 }
 
-
 double GetYearFrac( sal_Int32 nNullDate, sal_Int32 nStartDate, sal_Int32 nEndDate, sal_Int32 nMode ) THROWDEF_RTE_IAE
 {
     if( nStartDate == nEndDate )
@@ -523,6 +523,34 @@ double GetYearFrac( sal_Int32 nNullDate, sal_Int32 nStartDate, sal_Int32 nEndDat
 }
 
 
+//44456 calculation is not totally acurate, as it uses mean values for days in year or month
+//44456 return value when aFormat is not valid is not correct, an error message (for the user) should be produced, but how?
+#define DAYSINYEAR  365.2425  //365 + 1/4 - 1/100 + 1/400
+#define DAYSINMONTH  30.4369  //12 months in year
+sal_Int32 GetDateDif( sal_Int32 nStartDate, sal_Int32 nEndDate, const STRING& aFormat) THROWDEF_RTE_IAE
+{
+    if( nStartDate == nEndDate )
+        return 0;     // nothing to do...
+
+    sal_Int32 dd = nEndDate - nStartDate;
+//44456 improve comments
+    if ( aFormat == "y" )       // return number of years
+        return  sal_Int32( double( dd ) / DAYSINYEAR );
+    else if ( aFormat == "m" )  // return number of months
+        return sal_Int32( double( dd ) / DAYSINMONTH );
+    else if ( aFormat == "d" )  // return number of days
+        return dd;
+    else if ( aFormat == "md" ) // return number of days, ignoring months and years
+        return  fmod( fmod( double( dd ), double( DAYSINYEAR ) ), double( DAYSINMONTH ) );
+    else if ( aFormat == "ym" ) // return number of months, ignoring years
+        return  ( fmod( double( dd ), double( DAYSINYEAR ) ) /  DAYSINMONTH );
+    else if ( aFormat == "yd" ) // return number of days, ignoring months
+        return  fmod( double( dd ), double( DAYSINYEAR ) );
+
+    return 0;               // return value if unsupported format
+}
+
+
 double Fak( sal_Int32 n )
 {
     if( n > 0 )
diff --git a/scaddins/source/analysis/analysishelper.hxx b/scaddins/source/analysis/analysishelper.hxx
index 136a6e3..604b283 100644
--- a/scaddins/source/analysis/analysishelper.hxx
+++ b/scaddins/source/analysis/analysishelper.hxx
@@ -102,6 +102,8 @@ double              GetYearFrac( sal_Int32 nNullDate, sal_Int32 nStartDate, sal_
                         THROWDEF_RTE_IAE;
 inline double       GetYearFrac( constREFXPS& xOpt, sal_Int32 nStartDate, sal_Int32 nEndDate, sal_Int32 nMode )
                         THROWDEF_RTE_IAE;
+sal_Int32           GetDateDif( sal_Int32 nStartDate, sal_Int32 nEndDate, const STRING& aFormat )
+                        THROWDEF_RTE_IAE;
 inline void         AlignDate( sal_uInt16& rDay, sal_uInt16 nMonth, sal_uInt16 nYear );
 
 double              Fak( sal_Int32 n );
