2014-10-27 37 views
0

一个子系统(我无法控制)将数据导出到mysql表中,并将日期存储在从1900(http://support2.microsoft.com/kb/180162)开始的天数中。我需要将这些日期作为unix时间戳记返回。使用mysql转换日期,微软1900日期系统

两个日期

SELECT date FROM my_table WHERE id = 1 OR id = 2 
41315,3921180556 
41321,7267013889 

所需的输出

SELECT some_magic(date) FROM my_table WHERE id = 1 OR id = 2 
1360488279 
1361035587 

我找不到,没有工作的任何date-and-time-functions的例子。我错过了什么吗?

我希望SELECT日期的输出作为我写的PHP函数提供。

function UnMicrosoftify($fDateValue = 0, $iDateBase = 1900) { 
    if ($iDateBase == 1900) { 
     $iMyDateBase = 25569; 

     //Adjust for the fictional 29-Feb-1900 (Day 60) 
     if ($fDateValue < 60) { 
      --$iMyDateBase; 
     } 
    } else { 
     $iMyDateBase = 24107; 
    } 

    // Perform conversion 
    if ($fDateValue >= 1) { 
     $utcDays = $fDateValue - $iMyDateBase; 
     $iReturnValue = round($utcDays * 86400); 
     if (($iReturnValue <= PHP_INT_MAX) && ($iReturnValue >= -PHP_INT_MAX)) { 
      $iReturnValue = (integer) $iReturnValue; 
     } 
    } else { 
     $hours = round($fDateValue * 24); 
     $mins = round($fDateValue * 1440) - round($hours * 60); 
     $secs = round($fDateValue * 86400) - round($hours * 3600) - round($mins * 60); 
     $iReturnValue = (integer) gmmktime($hours, $mins, $secs); 
    } 
    return $iReturnValue; 
} 

echo UnMicrosoftify((float) str_replace(',','.', "41315,3921180556")) //displays 1360488279 (ie 2013-02-10 09:24:39) 
echo UnMicrosoftify((float) str_replace(',','.', "41321,7267013889")) //displays 1361035587 (ie 2013-02-16 17:26:27) 

是否有可能与MySQL做到这一点?怎么样?

回答

1

如果将日期存储为varchar,则必须将其转换为具有适当精度的小数点,然后按照第一个版本中的说明进行操作;如果它已经是第二个版本的小数点。

试试这个,我认为这是你想要什么:

SELECT 
    date AS ExcelSerialDate, 

    ADDDATE(ADDDATE(ADDDATE('1899-12-31 00:00', 
          cast(replace(date,',','.') as DECIMAL(30,12))), 
       INTERVAL -1 DAY), INTERVAL (MOD(date,1) * 86400) SECOND) 
    AS ConvDate, 

    UNIX_TIMESTAMP(
    ADDDATE(
     ADDDATE(
     ADDDATE('1899-12-31 00:00', 
       cast(replace(date,',','.') as DECIMAL(30,12))), 
     INTERVAL -1 DAY), 
     INTERVAL (
     MOD(cast(replace(date,',','.') as DECIMAL(30,12)),1) * 86400 
    ) SECOND 
    ) 
) 
    AS UnixTS_From_varchar, 

    UNIX_TIMESTAMP(
    ADDDATE(
     ADDDATE(
     ADDDATE('1899-12-31 00:00',date2), 
     INTERVAL -1 DAY), 
     INTERVAL (
     MOD(date2,1) * 86400 
    ) SECOND 
    ) 
) 
    AS UnixTS_from_double  

FROM my_table; 

Sample SQL Fiddle

与样品数据这给:

EXCELSERIALDATE  CONVDATE    UNIXTS_FROM_VARCHAR UNIXTS_FROM_DOUBLE 
41315,3921180556 2013-02-10 00:00:00 1360488279   1360488279 
41321,7267013889 2013-02-17 00:00:00 1361121987   1361121987 
+0

看来真的是有前途的,除了它下降的部分时间.. – daker 2014-10-27 14:28:53

+1

太棒了!十分感谢 :) – daker 2014-10-27 15:02:19