Sql-Server

根據行中的其他值使用日期時間值更新整個列

  • July 23, 2015

我有一張很大的桌子

$$ server $$.$$ dbo $$.$$ MyTable $$我需要 SQL 語句根據以下邏輯填充列“ToDateTime”(目前充滿 NULL):

  • 僅在 AID 等於 123 且 PID 等於 2 的行上向“ToDateTime”添加一個值。(下面的第 2、4、5 和 7 行)-否則將“ToDateTime”保留為 NULL。
  • 如果滿足上述條件,如果無法將數據 (varchar) 轉換為日期時間,則將“ToDateTime”設置/保留為 NULL(下面的第 5 行和第 7 行的數據將無法進行日期時間轉換)
  • 但如果它確實包含一個可以轉換為日期時間的值(第 2 行和第 4 行),請將其轉換並使用轉換後的值更新 ToDateTime 中的值。

前:

ID | AID | PID | ContainedData        | ToDateTime
_________________________________________________
1  | 123 |  1  | xxxx                 | NULL
2  | 123 |  2  | 7/21/2015 8:15:06 AM | NULL
3  | 234 |  2  | xyxy                 | NULL
4  | 123 |  2  | 19/07/2015 12:29:42  | NULL
5  | 123 |  2  | NULL                 | NULL
6  | 345 |  3  | zzzz                 | NULL
7  | 123 |  2  | badTimeString        | NULL

後:

ID | AID | PID | ContainedData        | ToDateTime
_________________________________________________
1  | 123 |  1  | xxxx                 | NULL
2  | 123 |  2  | 7/21/2015 8:15:06 AM | 2015-07-21 08:15:06.000
3  | 234 |  2  | xyxy                 | NULL
4  | 123 |  2  | 19/07/2015 12:29:42  | 2015-07-19 12:29:42.000
5  | 123 |  2  | NULL                 | NULL
6  | 345 |  3  | zzzz                 | NULL
7  | 123 |  2  | badTimeString        | NULL

我一直在嘗試類似於下面的查詢,但它為 ToDateTime 填充每一行的相同值(在我的實際數據的情況下,NULL。)我不確定類似於這個查詢的東西是否是正確的方法,或者如果我離開了。

UPDATE MyTable SET ToDateTime =
CASE
WHEN ISDATE(myT.cd)= 1 
THEN CONVERT(DATETIME, myT.cd)
ELSE NULL END
FROM (
SELECT ContainedData cd
FROM MyTable
WHERE [AID] = 123 AND [PID] = 2
) myT

看起來您那​​里至少有兩種不同的區域日期格式,可能是美國和歐洲?您可以按語言拆分更新…

像這樣的東西,它使用語言設置來控制 isdate 和轉換。

set language english;
update test_dates 
set ToDateTime = convert(datetime,ContainedData)
where AID='123' and PID='2' and isdate(ContainedData)=1;

set language british;
update test_dates 
set ToDateTime = convert(datetime,ContainedData)
where AID='123' and PID='2' and isdate(ContainedData)=1;

如果表太大而無法大塊更新,那麼您應該考慮將其包裝在一個帶有行限制和圍繞每次更新的事務的循環中,並重複直到更新零行。

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