使用mysql、Microsoft 1900日期系统转换日期

使用mysql、Microsoft 1900日期系统转换日期,mysql,sql,date,Mysql,Sql,Date,子系统(我无法控制)将数据导出到mysql表,并以1900()开始的天数存储日期。我需要这些日期作为unix时间戳返回 两个日期的示例 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 我找不到任何能胜任

子系统(我无法控制)将数据导出到mysql表,并以1900()开始的天数存储日期。我需要这些日期作为unix时间戳返回

两个日期的示例

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
我找不到任何能胜任这项工作的。我错过什么了吗

我希望选择的日期的输出能够像我编写的这个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)
函数unmicrosofify($fDateValue=0,$iDateBase=1900){
如果($iDateBase==1900){
$iMyDateBase=25569;
//调整为虚构的1900年2月29日(第60天)
如果($fDateValue<60){
--$iMyDateBase;
}
}否则{
$iMyDateBase=24107;
}
//执行转换
如果($fDateValue>=1){
$utcDays=$fDateValue-$iMyDateBase;
$iReturnValue=四舍五入($utcDays*86400);
如果($iReturnValue=-PHP\u INT\u MAX)){
$iReturnValue=(整数)$iReturnValue;
}
}否则{
$hours=整数($fDateValue*24);
$mins=整轮($fDateValue*1440)-整轮($hours*60);
$secs=round($fDateValue*86400)-round($hours*3600)-round($mins*60);
$iReturnValue=(整数)gmmktime($hours、$mins、$secs);
}
返回$iReturnValue;
}
echo Uncrosofify((float)str_replace(‘,‘,‘,‘,‘,‘,’,‘413153921180556’)//显示1360488279(ie 2013-02-10 09:24:39)
echo Uncrosofify((float)str_replace(“,”,“,”,“413217267013889”)//显示1361035587(ie 2013-02-16 17:26:27)

有可能用mysql做到这一点吗?如何处理?

如果日期存储为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;

根据您的示例数据,这将提供:

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