我使用CSV文件中的BULK INSERT
创建了一个表格。我试过约会,但无法通过。它给了我错误,所以尝试使用TradeDate varchar(50)
,一切正常并保存了' 11012012'在Tradedate专栏中。
但是,当我尝试使用select query检索数据时:
SELECT *
FROM FundTranTest
WHERE CONVERT(DATETIME, RIGHT(TradeDate,4) + Left(TradeDate, 2) + SUBSTRING(TradeDate, 3, 2))
< '2012-12-29'
我收到了这个错误:
Msg 242,Level 16,State 3,Line 1
将varchar数据类型转换为日期时间数据类型会导致超出范围的值。
如何完成这项工作?任何帮助都会很棒。
然后尝试通过添加日期列来更新表:
ALTER TABLE FundTranTest ADD TDate Date
WITH Udata AS
( select TradeDate as rcol
from FundTranTest
)
UPDATE FundTranTest SET TDate = CONVERT(DATETIME,RIGHT(rcol,4)+Left(rcol,2)+SUBSTRING(rcol,3,2))
FROM Udata u
where FundTranTest.TradeDate = u.rcol
但它没有用......
答案 0 :(得分:0)
由于错误以及评论员告诉您,您导入的数据不是有效的日期时间格式。这也是您的更新失败,数据本身不正确的原因,这是问题的根本原因,您需要在继续之前修复数据。
您需要执行以下操作之一:
tradedate
的值错误位置来更正CSV文件中的数据,更正它们,然后将数据重新导入到表中,但这次是正确的数据类型列(所以不是varchar(50)
,而是datetime
)。tradedate
列从varchar(50)
转换为datetime
列。无论您选择哪种方法,请注意@marc_s
字词和链接:
Bad habits to kick : choosing the wrong data type 你应该总是使用最合适的数据类型 - 毕竟这就是它们的用途!
对于某些帮助,如果你选择了第二种方法,这里有一些提示,了解如何验证列中的信息,这些不会开始涵盖数据可能出错的地方,但是它应该给你并想出你可以检查验证的其他所有内容:
select tradedate,
*
from FundTranTest
where -- Look for TradeDate's that are not even 8 chars long
len(tradedate) <> 8
-- Shows any years that are not starting with a 2
or right(TradeDate, 4) not like '2%'
-- Check that your months are correct
or left(tradedate, 2) not in ('01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12')
-- check that dates are correct
or substring(tradedate, 3, 2) not in ('01', '02', '03', '04', '05', '06', '07', '08', '09', '10',
'11', '12', '13', '14', '15', '16', '17', '18', '19', '20',
'21', '22', '23', '24', '25', '16', '17', '18', '19', '30',
'31')