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