我公司的工作场所有一个MYSQL数据库,时间戳通常存储如下:
ModDate | ModTime | Other fields
------------------------------
20110405 | 203055 | .....
20110506 | 214016 | .....
我确信当时可能有一个合理的理由(开发人员已离开),但我们现在主要使用SQL Server。
我已经编写了一个查询来将ModDate
字段转换为标准DATETIME
,但显然我总是将时间设为00:00:00
。
如何从SQL Server中获取有效的DATETIME
对象,该对象组合了ModTime
和ModDate
字段,以便获得组合正确的值?注意,我已经将它们提取到本地结果集中,我无意更改MYSQL数据库(我只是用OPENQUERY
从中提取)。
答案 0 :(得分:3)
假设该表现在在SQL Server中,并且该问题与MySQL无关。
UPDATE dbo.TableName
SET ModDate = CONVERT(DATETIME,
CONVERT(CHAR(8), ModDate, 112) + ' '
+ STUFF(STUFF(ModTime,3,0,':'),6,0,':'));
如果你想先确定它是正确的,只需运行:
SELECT
ModDate, ModTime, NewModDate = CONVERT(DATETIME,
CONVERT(CHAR(8), ModDate, 112) + ' '
+ STUFF(STUFF(ModTime,3,0,':'),6,0,':'))
FROM dbo.TableName;
答案 1 :(得分:1)
如果你确实在寻找一个MySQL解决方案,这将符合法案,假设YYYYMMDD和HHMMSS:
update yourtable set datetimecol =
cast(concat(substring(moddate,1,4),'-',
substring(moddate,5,2),'-',
substring(moddate,7,2),' ',
substring(modtime,1,2),':',
substring(modtime,3,2),':',
substring(modtime,5,2)) as datetime)
如果您不想保留数据,那么只需执行选择,而不是更新,如下所示:
select cast(concat(substring(moddate,1,4),'-',
substring(moddate,5,2),'-',
substring(moddate,7,2),' ',
substring(modtime,1,2),':',
substring(modtime,3,2),':',
substring(modtime,5,2)) as datetime) as DateTimeCol
from yourtable
答案 2 :(得分:0)
...假设20110405是2011年4月5日,并且您有一个名为datetimecol的新列,您可以这样做:
update yourtable set datetimecol =
convert(datetime, substring(moddate,1,4) + '-' +
substring(moddate,5,2) + '-' +
substring(moddate,7,2)+ ' ' +
substring(modtime,1,2) + ':' +
substring(modtime,3,2) + ':' +
substring(modtime,5,2))
答案 3 :(得分:0)
要将时间部分添加到datetime列:您可以使用TIME_TO_SEC查询MySQL以返回总秒数,然后在MSSQL中使用DATEADD
这样的事情:
UPDATE <TABLE>
SET <datetime column> = DATEADD(second, <MYSQL_QUERY>.TOTAL_SECONDS, <datetime column>)
FROM <TABLE>
INNER JOIN <MYSQL_QUERY> ON <TABLE>.<KEY> = <MYSQL_QUERY>.<KEY>
&lt; MYSQL_QUERY&gt;是:
SELECT <KEY>,TIME_TO_SEC(MOD_TIME) FROM ...
我不确定你是否可以在连接中使用OpenQuery,但我很肯定它会起作用。如果OpenQuery不能使用连接,那么可以将查询结果存储到MSSQL中的临时表中。