Sql-Server
將 CHAR 轉換為 DATETIME,以便我可以使用 DATEADD()
我有一個關於對
DATEADD()
標識為的列使用函式的問題CHAR (6)
該
time_stamp
列保存的值如131329
ashhmmss
。每當我嘗試創建一個新列來保存列的值time_stamp
+ 5 分鐘時,我都會收到錯誤消息。消息 242,級別 16,狀態 3,第 1
行將 char 數據類型轉換為日期時間數據類型導致超出範圍的日期時間值。
我想要做的是創建一個比
time_stamp
. 我現在正在處理一份顯示“已完成訂單”的報告,但我需要該報告將訂單保留為未完成至少 5 分鐘,然後才能在報告中顯示為已完成。
好吧,首先,您應該使用正確的列來修復您的表格並儲存日期/時間數據,而不是因為未知原因而將其分解。將時間儲存為 是誰的決定
CHAR(6)
?你能想出一個好的理由嗎?你在哪裡儲存日期?是今天下午 1 點,上週二還是 2012 年 10 月的某個時候?這確實應該是一個日期時間列。有“設計師”請閱讀這個和這個。但除此之外(有趣的是,每次你建議更換桌子時,他們都說他們不能更換桌子):
DECLARE @x TABLE(y CHAR(6)); INSERT @x(y) VALUES('131329'); SELECT DATEADD(MINUTE,5,CONVERT(TIME(0),STUFF(STUFF(y,5,0,':'),3,0,':'))) FROM @x;
結果:
13:18:29
如果您發現該查詢既醜陋又乏味,那就太好了!有一個很好的理由:您儲存數據錯誤。
這也不會是您在此設計中遇到的最後一個問題。是什麼阻止某人在您的列中插入
967286
orfoobar
?如果您需要解決該問題,您可以在 2012 年及更高版本中使用(請始終使用特定於版本的標籤指定版本)或早期版本中的表達式。<empty string>``CHAR(6)``TRY_CONVERT()``CASE
DECLARE @x TABLE(y CHAR(6)); INSERT @x(y) VALUES('foobar'); -- 2012: SELECT DATEADD(MINUTE,5,TRY_CONVERT(TIME(0), STUFF(STUFF(y,5,0,':'),3,0,':'))) FROM @x; -- older: SELECT DATEADD(MINUTE,5,CONVERT(TIME(0), CASE WHEN ISDATE(STUFF(STUFF(y,5,0,':'),3,0,':'))=1 THEN STUFF(STUFF(y,5,0,':'),3,0,':') END)) FROM @x;