我有此插入语句失败,抛出此错误:
第242条消息,级别3,状态3,第1行
从varchar数据类型到datetime数据类型的转换导致值超出范围。该声明已终止。
这是插入语句:
INSERT INTO JOBR_GENERIC (ID, NUM_ATTR1, STR_ATTR1, TYPE, PLANT_ID,
MATERIAL_NUMBER, ORDERNO, LOTNO, QTY, DATE_ATTR1,
STR_ATTR2, NUM_ATTR2, NUM_ATTR3, NUM_ATTR4,
STR_ATTR3, NUM_ATTR5, NUM_ATTR6, NUM_ATTR7,
NUM_ATTR9, NUM_ATTR10, NUM_ATTR11, DATE_ATTR2,
DATE_ATTR3, DATE_ATTR4, NUM_ATTR12, NUM_ATTR13, STR_ATTR4, JOBR_TS)
VALUES (153322, 401129, '901', 'A', 'A85',
'8ALD160', '', '6666666A', 8, CONVERT(DATETIME, '24/06/2017 00:00:00', 120),
'Test', 1, 9, 1,
'', 36, 99999999, 0,
109, 0, 0, CONVERT(DATETIME, '15/06/2018 16:08:26:397', 120),
CONVERT (DATETIME, '15/06/2018 16:08:26:397', 120), CONVERT(DATETIME, '', 120), 0, 0,
'A85', CONVERT(DATETIME, '2018-07-05 12:31:34', 120))
答案 0 :(得分:2)
您的代码CONVERT(DATETIME, '15/06/2018 16:08:26:397', 120)
是错误的(与其他大多数convert语句一样)。
120
告诉SQL期望日期格式为yyyy-mm-dd hh:mi:ss
。检查https://docs.microsoft.com/en-us/sql/t-sql/functions/cast-and-convert-transact-sql?view=sql-server-2017以获取格式列表。
确保您的文本格式与您告诉服务器的期望匹配。对于上面的示例,103
(匹配dd/mm/yyyy
)将为您工作:
CONVERT(DATETIME, '15/06/2018 16:08:26:397', 120)
我还建议在整个查询中使用一致的日期格式,而不是像现在这样混合和匹配。一致的方法将使维护代码和发现错误变得更加容易。
答案 1 :(得分:1)
(1)您不需要进行转换。只需使用适当类型的字符串即可。
(2)将空字符串转换为日期/时间没有意义。只需使用NULL
或将该列排除在insert
之外。所以:
VALUES (153322, 401129, '901', 'A', 'A85', '8ALD160', '', '6666666A', 8,
'2017-06-24 00:00:00', 'Test', 1, 9, 1, '', 36, 99999999,
0, 109, 0, 0, '2018-06-15 16:08:26:397',
'2018-06-15 16:08:26:397', NULL, 0, 0, 'A85',
'2018-07-05 12:31:34'
)
答案 2 :(得分:0)
您尝试使用的格式是ODBC YYYY-MM-DD格式,但是,您有一个日期参数,格式为DD / MM / YYYY。这是行不通的。