2017-08-11 85 views
0

我一直在使用以下格式插入我的mysql數據庫以前,並希望保持它的統一。將是在日期時間MSSQL(c.LastLogon, c.CreatedOn, c.ChangedOn)到MySQL字段也是日期時間的字段時如何從MySQL插入日期時間到MySQL從INSERT INTO OPENQUERY SELECT

INSERT INTO  OPENQUERY (ENET, 'SELECT * FROM ActiveDirectory.Computers') -- MYSQL database 
SELECT   c.[CommonName], 
       c.[DistinguishedName], 
       c.[SAMAccountName], 
       c.[DNSHostName], 
       c.[Location], 
       c.[Division], 
       c.[Department], 
       c.[ManagedBy], 
       c.[MachineRole], 
       CAST(CAST(c.[LastLogon] as timestamp) as datetime) AS LastLogon, 
       c.[OperatingSystem], 
       c.[OperatingSystemVersion], 
       c.[ServicePack], 
       c.[OU], 
       c.[CreatedOn], 
       c.[ChangedOn], 
       CASE WHEN c.[UserAccountControl] & 2 = 0 THEN 1 ELSE 0 END AS [Enabled]  -- Check to see if disabled. Disabled = bitwise of 2; 4098 = 4096 + 2 = Trust Account + Disabled 
FROM   [IT_ActiveDirectory].[dbo].[ADComputerTable] c -- MSSQL database 

我的問題就來了。我已經嘗試過幾乎所有可以想到的CAST()CONVERT()的組合,但我可能錯過了一些東西。我也嘗試將mysql的字段類型更改爲時間戳。

它返回:Conversion failed when converting date and/or time from character string.

我覺得奇怪,我說,MSSQL將不只是將數據發送到MySQL,讓它做轉換。相反,它看起來好像在將數據類型和數據發送到MYSQL之前試圖轉換和匹配數據類型和數據。

如果我不能用這種方式插入它,我可以使用另一種格式,例如可以在OPENQUERY() SELECT中插入。有什麼建議麼?此刻我死在水中。

回答

0

我會嘗試轉換爲ISO-8601格式的字符串:

INSERT INTO OPENQUERY (ENET, 'SELECT * FROM ActiveDirectory.Computers') 
SELECT 
    ..., 
    CONVERT(VARCHAR, LastLogon, 126) AS LastLogon 

FROM [IT_ActiveDirectory].[dbo].[ADComputerTable]; 

而且我不喜歡OPENQUERYSELECT *。如果列按位置匹配,則容易出錯。考慮將開始擴展到列。