2017-07-25 90 views
1

我在這裏遇到了這個錯誤,並嘗試更改數據類型並使用了Convert,但似乎沒有任何東西解決這個問題。所以我想在這裏尋求幫助。我會盡量給予儘可能多的信息,但隨時問問它是否不夠。Msg 242:將varchar數據類型轉換爲日期時間數據類型導致超出範圍值

這是我收到的錯誤:

Insert into prompt(ID, Date) 
    select 
     ROW_NUMBER() over (order by b.IDLoc), 
     [dbo].[fn_GetGPtime](cast (replace(DateCollected, '/', '-') + ' ' + a.UTCTime as datetime)) 
    from 
     Img a 
    inner join 
     Tloc b on a.Filename = b.filename 
    order by 
     b.IDLoc 

在提示表中的列Datefloat數據類型。 UTCTimeDateCollected都是varchar(20)

的錯誤是:

Msg 242, Level 16, State 3, Line 274
The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.

下面是函數:

[dbo].[fn_GetGPtime] (@UTCtime datetime) 
returns varchar(50) 
AS 
BEGIN 
    return (DATEPART (WEEKDAY, @UTCtime) - 1) * 86400 ---day 
      + DATEPART (HOUR, @UTCtime) * 3600 ---hour 
      + DATEPART (MINUTE, @UTCtime) * 60 ----minutes 
      + DATEPART (SECOND, @UTCtime) ---second 
      + (DATEPART (MILLISECOND, @UTCtime)) * 0.001 ---ms 
      + (DATEPART (MICROSECOND, @UTCtime)) * 0.000001 ---us 
      + 16 ----leap seconds 
end; 

來獲取數據本身的想法:

enter image description here

我如何解決這個問題?

+0

什麼是MIN()'收集日期?任何空白或「NULL」日期? –

+0

@AaronDeitz datecollected的最小值是07/17/2017。無空日期或'' – SQLserving

+0

@marc_s我同意你和Rominus關於數據類型的良好決定,但不幸的是,有時候你繼承了不理想的東西。我無法對數據類型進行更改,因爲它具有前端集成。 – SQLserving

回答

1

你的錯誤信息可能意味着兩種不同的東西:在某些單元格中存在不可轉換的數據,或者該字段的數據根本無法轉換爲日期時間。

您可以使用try_convert而不是convert來確定它是哪一個。如果您有幾個完全不可用的值(即錯誤的數據),它將解決您的問題;你會得到空數據和良好的數據轉換。如果整體轉換永遠不會起作用,那麼您將得到所有的空值,並且您會知道這不僅僅是一些不好的值。

您可以嘗試的另一件事是轉換爲日期時間之前從浮動轉換爲數字。我發現float格式的數據對於轉換很糟糕,轉換爲numeric可以消除許多問題。你有類似的東西convert(datetime, convert(numeric(18,2), UTCTime))

0

使用convert而不是cast。使用convert時,可以指定表示日期的字符串的格式。
一旦轉換DateCollecteddatetime,你可以投a.UTCTimedatetime並把它們相加:

Insert into prompt(ID,Date) 
select ROW_NUMBER() over (order by b.IDLoc), 
[dbo].[fn_GetGPtime](convert(datetime, DateCollected, 101) + cast(a.UTCTime as datetime)) 
from Img a inner join Tloc b on a.Filename=b.filename 
order by b.IDLoc 

(假設a.UTCTime或者是varchartime

+0

@ZoherPaled UTCTime和DateCollected都是varchar(20)。我嘗試了你推薦的查詢,但得到了同樣的錯誤。 – SQLserving

+1

你使用的是什麼版本的sql server?此外,嘗試運行'選擇轉換(日期時間,DateCollected,101)從Img'看看你得到什麼。 –

+0

Sql Server版本是2014年,我試了這個,它運行結果如2017-07-19 00:00:00。000 – SQLserving

相關問題