我有一個名為的表usda_losses_temp,其中有一個nvarchar(50)名為的型別列end_date,它們是格式中的日期值yyyy-mm-dd。我正在嘗試將此資料放入end使用以下查詢呼叫的新列中:
update usda_losses_temp
set end = cast((substring(hazard_end_date, 1, 4) '-' substring(hazard_end_date, 6, 2) '-' substring(hazard_end_date, 9, 2)) as date)
但是,我收到以下錯誤:
從字串轉換日期和/或時間時轉換失敗。
示例查詢:
update usda_losses_temp
set end_date = cast((substring('2020-09-31', 1, 4) '-' substring('2020-09-31', 6, 2) '-' substring('2020-09-31', 9, 2)) as date)
我也試過
update usda_losses_temp
set end = FORMAT((substring(hazard_end_date, 1, 4) '-' substring(hazard_end_date, 6, 2) '-' substring(hazard_end_date, 9, 2)),'yyyy-MM-dd')
但它給了我一個錯誤說:
引數資料型別 nvarchar 對格式函式的引數 1 無效。
我無法讓它作業。我該如何解決?
uj5u.com熱心網友回復:
為什么不使用正確的(120)格式轉換?
update usda_losses_temp set [end] = convert(date, hazard_end_date, 120);
見dbfiddle
如果那不起作用,那么您的資料中提供的格式有一些無效的日期。
uj5u.com熱心網友回復:
無論您應用何種格式或子字串,您的示例日期'2020-09-31'都無法轉換為日期。九月只有三十天。
從而揭示了潛在的問題:這些從一開始就不應該存盤為字串。
要查找有問題的行:
SELECT * FROM usda_losses_temp WHERE ISDATE(hazard_end_date) = 0;
一旦你修復了你的壞資料,你應該使用CONVERT, col, 120)Dale 建議的簡單語法,而不是所有這些混亂的子字串 goop。
并添加一個檢查約束 ( CHECK (ISDATE(hazard_end_date)) = 1),直到您或他們可以修復該表。因為這才是真正的問題。
uj5u.com熱心網友回復:
嘗試使用 convert() 而不是 cast():
update usda_losses_temp
set end_date = CONVERT(datetime,(substring('2015-09-29', 1, 4) '-' substring('2020-09-29', 6, 2) '-' substring('2020-09-29', 9, 2) 'T23:59:59.000'), 126)
'2020-09-31' 也從 varchar 引發了一個超出范圍的轉換例外。Datetime 確實隱式轉換為日期欄位的日期。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/415827.html
標籤:
上一篇:使用TeradataSQL修改TRUNC、ADD_MONTHS、LAST_DAY查詢以便在SQLServer上作業?
下一篇:SQLServer資料庫角色-表
