Sql-Server

將 CHAR 轉換為 DATETIME,以便我可以使用 DATEADD()

  • May 8, 2020

我有一個關於對DATEADD()標識為的列使用函式的問題CHAR (6)

time_stamp列保存的值如131329as hhmmss。每當我嘗試創建一個新列來保存列的值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

如果您發現該查詢既醜陋又乏味,那就太好了!有一個很好的理由:您儲存數據錯誤

這也不會是您在此設計中遇到的最後一個問題。是什麼阻止某人在您的列中插入967286or foobar?如果您需要解決該問題,您可以在 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;

引用自:https://dba.stackexchange.com/questions/114711