Sql-Server-2008-R2

為什麼每次執行時從 varchar do date 轉換都會在不同的行上失敗?

  • January 13, 2020

我有一個這樣的欄位的數據庫(不知道為什麼它是 varchar):

19950105

我正在嘗試將其轉換為 DATE 作為 DDMMYYYY。

我可以這樣做:

convert(varchar(10), cast(The_ugly_field as date),103) 

然後我的日期是:

05/01/1995

1)為什麼我不能直接將其轉換為日期?如果我使用:

select convert(date,The_ugly_field,103) from Ugly_Table

它返回1900-01-01並且不尊重 103。那裡的任何數字都返回相同的格式 YYYY-MM-DD。

2)現在真正的問題。當我跑步時

select  convert(varchar(10), cast(The_ugly_field as date),103)  
From Ugly_Table
order by The_ugly_field

一段時間後它返回此錯誤:

消息 241,級別 16,狀態 1,第 29 行從字元串轉換日期和/或時間時轉換失敗。

但有趣的是,錯誤看起來並沒有出現在同一行。如果我執行此程式碼 4 次,則每次返回錯誤時,都會顯示不同的行。我的意思是,我執行它,然後在“結果”選項卡中我可以看到它返回了1.234.555 rows. 如果我再次執行它,在錯誤之後我返回到“結果”表,現在查詢執行到1.556.345.

請。我怎麼能20140101以優雅的方式將其轉換為2014/31/12?跑步convert(date,E1_EMISSAO,103)似乎不尊重103and 它返回2017-02-24而不是24/02/2017

大量的問題和答案,但都是關於一個簡單的轉換()。

處理不同數量的行後發生錯誤的原因是轉換不是以確定的順序完成的。這取決於執行計劃。

尤其是如果查詢是並行的(考慮到行數,我希望是這樣),每次執行時行線上程中的分佈會有所不同,並且每次都可能以不同的順序命中“計算標量”。

其他原因是可能使用了不同的索引(導致行的排序不同),儘管考慮到查詢的靜態性質,這似乎不太可能。


執行此操作時格式化參數不起作用的原因:

select convert(date,The_ugly_field,103) from Ugly_Table

…是因為您嘗試使用的 103 樣式用於將日期或日期時間轉換為字元數據類型。不是日期的varchar(這就是 CONVERT 語句的作用)。在這種情況下,SQL Server 只是以實例的預設格式顯示日期。


您需要手動追踪無法轉換的“壞”數據:

  • 可選:MAXDOP 1向查詢添加提示,以使返回的數據順序更具確定性
  • 查看查詢成功返回的最後一行
  • 在沒有轉換的情況下執行您SELECT並手動檢查該區域中的值
  • 如果可能,更正或刪除不良數據
  • 向 中添加一條CASE語句以SELECT避免嘗試轉換錯誤的值,如下所示:
select  CASE WHEN LEN(The_ugly_field) < 8 THEN '01/01/1900' ELSE convert(varchar(10), cast(The_ugly_field as date),103)  END
From Ugly_Table
order by The_ugly_field

我會建議TRY_CONVERT,但這僅適用於 SQL Server 2012 及更高版本。

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