我有一個有 100 萬行和一CREATED_AT varchar列的表格。此列中日期字串的格式:
- 2021-10-13 05:03:42.638 00
- 2021-10-18 21:28:49.98 00
- 2021-12-08 02:09:03.17 00
我想將此字串轉換為一個新datetime列(稱為CREATED_DT)。
嘗試
select
cast([CREATED_AT] as datetime)
from
[mydb].[dbo].[mytable]
錯誤:
從字串轉換日期和/或時間時轉換失敗
select
convert(datetime, [CREATED_AT])
from
[mydb].[dbo].[mytable]
從字串轉換日期和/或時間時轉換失敗
select
try_convert(DateTime, [CREATED_AT])
from
[mydb].[dbo].[mytable]
查詢執行,但回傳所有空值。
select
try_convert(DateTime, [CREATED_AT], 108)
from
[mydb].[dbo].[mytable]
查詢執行,但回傳所有空值。
select
try_cast([CREATED_AT] as datetime)
from
[mydb].[dbo].[mytable]
查詢執行,但回傳所有空值。
uj5u.com熱心網友回復:
假設你永遠不必關心最后無用 00的東西(它總是 00或者你不關心它是否曾經是別的東西),并且你可以失去一點點精度,你可以取左邊的 22 個字符并嘗試使用安全樣式編號(在您的情況下為 120)轉換值:
DECLARE @d table(CREATED_AT varchar(32));
INSERT @d(CREATED_AT) VALUES
('2021-10-13 05:03:42.638 00'),
('2021-10-18 21:28:49.98 00'),
('2021-12-08 02:09:03.17 00');
SELECT CREATED_AT,
as_datetime = TRY_CONVERT(datetime, LEFT(CREATED_AT, 22), 120)
FROM @d;
如果您不想失去精度(例如,您不能保持.638as datetime),或者如果某些值可能有 1 或 0 個小數位,或者某些值可能根本不包含 xx,您可以做一些事情類似,但使用一些字串技巧來截斷 出現的值(如果沒有也處理):
SELECT CREATED_AT,
as_datetime2 = TRY_CONVERT(datetime2(3),
LEFT(CREATED_AT, COALESCE(NULLIF(CHARINDEX(' ',
CREATED_AT), 0), 32)-1), 120)
FROM @d;
- 示例資料庫<>小提琴
為了說明為什么在這里使用 120 樣式編號很重要,請參閱此 db<>fiddle。
uj5u.com熱心網友回復:
您正在尋找的樣式是127,但您的問題是您只包含時區的小時,您還需要分鐘。所以只需添加:00到每個值。
然后,您可以datetime從那里轉換為常規,使用SWITCHOFFSET
DECLARE @v varchar(30) = '2021-10-13 05:03:42.638 00';
SELECT TRY_CONVERT(datetimeoffset, @v ':00', 127);
SELECT CONVERT(datetime, SWITCHOFFSET(TRY_CONVERT(datetimeoffset, @v ':00', 127), 0));
資料庫<>小提琴
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/403165.html
標籤:
