2016-06-27 45 views
0

現在,我正在將mssql遷移到mariadb(mysql)。 Mssql具有子句(帶有as()),但是mysql沒有使用子句。所以我使用「創建臨時表」,但發生了一些錯誤。如何在mariadb或mysql中創建一個臨時表?

例,

CREATE TEMPORARY TABLE TMP(
    SELECT CAST(DATE_FORMAT(NOW(), '%Y-%m-%d %T.%f') AS CHAR(19)) AS REGDT 
); 

,這是錯誤代碼

MySQL Database Error: Truncated incorrect CHAR(19) value: '2016-06-27 10:34:34.000000'

有什麼不對?

這是我的查詢。

CREATE TEMPORARY TABLE TMP(
    SELECT DEPTCODE, DEPTNAME, USEYN, HIGHDEPTCODE, 
     CAST(DATE_FORMAT(REGDT, '%Y-%m-%d %T.%f') AS CHAR(19)) AS REGDT, 
     0 AS LEV, CAST(DEPTCODE AS CHAR(255)) AS SORT, DEPTORDER 
    FROM TBDEPARTMENT 
    WHERE DEPTCODE = '1000'); 

回答

2

CHAR(19)太小而無法以毫秒爲單位存儲整個日期。

使用CHAR(26)改爲:

CREATE TEMPORARY TABLE TMP(
    SELECT CAST(DATE_FORMAT(NOW(), '%Y-%m-%d %T.%f') AS CHAR(26)) AS REGDT 
); 

或刪除毫秒:

CREATE TEMPORARY TABLE TMP(
    SELECT CAST(DATE_FORMAT(NOW(), '%Y-%m-%d %T') AS CHAR(19)) AS REGDT 
); 

你也可以使用一個DATETIME類型,而不是一個字符串。

+1

謝謝您的回答! – HanTael

+1

或者不要將日期時間存儲爲字符串(!?)。這是'DATETIME(6)',不是嗎? –

1

沒有骨頭斷了,所以沒有CAST需要:

mysql> SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %T.%f'); 
+--------------------------------------+ 
| DATE_FORMAT(NOW(), '%Y-%m-%d %T.%f') | 
+--------------------------------------+ 
| 2016-07-03 16:23:28.000000   | 
+--------------------------------------+ 

如果您在表中把只有一個值,可以考慮使用一個@變量:

mysql> SELECT @regdt := DATE_FORMAT(NOW(), '%Y-%m-%d %T.%f'); 
+------------------------------------------------+ 
| @regdt := DATE_FORMAT(NOW(), '%Y-%m-%d %T.%f') | 
+------------------------------------------------+ 
| 2016-07-03 16:26:07.000000      | 
+------------------------------------------------+ 
1 row in set (0.00 sec) 

mysql> SELECT @regdt; 
+----------------------------+ 
| @regdt      | 
+----------------------------+ 
| 2016-07-03 16:26:07.000000 | 
+----------------------------+