2012-10-26 66 views
-1

當我試圖轉換日期我收到以下錯誤轉換MM/DD/YYYY HH:MM; SS AM/PM爲datetime

DECLARE @MinLogDate AS varchar(100) 
DECLARE @MinDate AS DATETIME 

SET @MinLogDate = '10/26/2012 01:23:90 AM' 
SET @MinDate = (SELECT CONVERT(CHAR(10), CONVERT(datetime, @MinLogDate,103),101)) 

錯誤:

The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.

我怎樣才能將varchar時間轉換爲datetime?

編輯

基於我已經修改了答案..下面是實際的日期時間我得到..所以現在我能得到MINDATE但最大日期不工作

DECLARE @MinDate AS DATETIME 
    DECLARE @MaxDate AS DATETIME 
    DECLARE @MinLogDate AS varchar(100) 
    DECLARE @MaxLogDate AS varchar(100) 

    SET @MinLogDate = '8/1/2012 01:00:00 AM' 
    SET @MaxLogDate = '8/31/2012 01:00:00 PM' 

    SET @MinDate = CONVERT(datetime, LEFT(@MinLogDate, 10), 101) 
    SET @MaxDate = CONVERT(datetime, LEFT(@MaxLogDate, 10), 101) 

    SELECT @MinDate 
    SELECT @MaxDate 
+0

'CAST('10 /二千○十二分之二十六上午01點23分59秒」爲DATETIME)'應該工作,它不會在你的情況下,'01:23:在過去使用90'是不是有效的時間(90秒s?)是你的問題*如何處理無效日期*?如果是的話,哪些部分可能無效? –

+0

@AlexK它不是90,因爲虛擬的目的,我插入了類似的日期,但犯了一個錯誤。 – Zerotoinfinity

+0

所以你只需要日期部分?你是約會的訂單嗎?嘗試 'set dateformat mdy;選擇CAST('10/26/2012 01:23:59 AM'as date)'。 –

回答

1

試試這個:CHANGE:如上答案我從103

DECLARE @MinLogDate AS varchar(100) 
DECLARE @MinDate AS DATETIME 

SET @MinLogDate = '10/26/2012 01:23:10 AM' 
SET @MinDate = (SELECT CONVERT(CHAR(10), Replace(CONVERT(VARCHAR(20), Cast(@MinLogDate AS DATETIME), 101), '-', '/'))) 
+0

爲我工作..謝謝:-) – Zerotoinfinity

1

首先103是英國/法國dd/mm/yyyy,您似乎將從美國mm/dd/yyyy應該是101轉換。

根據代碼中的CHAR(10)來判斷 - 你只是在尋找日期部分?如果是的話,這應該是充足的:

SET @MinDate = CONVERT(datetime, LEFT(@MinLogDate, 10), 101) 

UPDATE:

而且你更新的問題,現在應該做的伎倆:

SET @MinDate = CONVERT(datetime, LEFT(@MinLogDate, CHARINDEX(' ', @MinLogDate)), 101) 
SET @MaxDate = CONVERT(datetime, LEFT(@MaxLogDate, CHARINDEX(' ', @MaxLogDate)), 101) 
+0

這是查詢窗口中工作絕對正常,但是當我在SP中做同樣的事情時,我得到這個varchar數據類型轉換爲日期時間數據 類型導致超出範圍的值。「。可能的失敗原因:查詢問題,「 ResultSet」屬性設置不正確,參數設置不正確或連接未正確建立 – Zerotoinfinity

+0

我已經根據您的解決方案編寫了我的答案 – Zerotoinfinity

1

時間和日期覆蓋。

將它們分解爲組成元素。

DECLARE @MinLogDate AS varchar(100) 
DECLARE @MinDate AS DATETIME 
SET @MinLogDate = '10/26/2012 01:23:30 AM' 


DECLARE @minLD varchar(16) 
DECLARE @minLT varchar(16) 

-- In response to user's comment 
SET @minLD = LEFT(@MinLogDate,CHARINDEX(' ',@MinLogDate)); 
SET @minLT = RIGHT(@MinLogDate, LEN(@MinLogDate) - CHARINDEX(' ', @MinLogDate)); 

SELECT @MinDate = CONVERT(datetime, @minLD, 101) + CONVERT(time, @minLT) 

注:

我改變了你的時間字符串是一個有效的出發:)

額外注

像巴里之前,我改變103101

編輯:以響應不斷變化的問題:d

+0

+1,但這些不適用於最大日期時間。你請再考慮編輯部分 – Zerotoinfinity

+0

你的@MaxLogDate沒有設置任何東西 –

+0

哎呀!我corerct :) :) – Zerotoinfinity

0
下面

改變日期格式類型101是所有格式我

select CONVERT(VARCHAR(19),GETDATE()) 
    select CONVERT(VARCHAR(10),GETDATE(),10) 
    select CONVERT(VARCHAR(10),GETDATE(),110) 
    select CONVERT(VARCHAR(11),GETDATE(),6) 
    select CONVERT(VARCHAR(11),GETDATE(),106) 
    select CONVERT(VARCHAR(24),GETDATE(),113) 
    select CONVERT(VARCHAR(10),GETDATE(),101) 
    select CONVERT(VARCHAR(10),CAST(GETDATE() AS DATE), 101) 
    select CONVERT(VARCHAR(8), GETDATE(), 1) 
    select CONVERT(VARCHAR(10), GETDATE(), 101) 
    select CONVERT(VARCHAR(8), GETDATE(), 10) 
    select CONVERT(VARCHAR(10), GETDATE(), 110) 
    select CONVERT(VARCHAR(23), GETDATE(), 121) 
    select CONVERT(varchar(23), getdate()+0.20, 121) 
    select CONVERT(varchar(23), getdate()+0.20, 21) 
    select CONVERT(varchar(23), getdate()+0.20, 20) 
    select CONVERT(varchar(23), getdate()+0.20, 120) 
    select convert(varchar (10),CONVERT(varchar(23), getdate(), 120),110) 

    select datediff(week, dateadd(week, datediff(week, 0, dateadd(month, datediff(month, 0, getdate()), 0)), 0), getdate() - 1) + 1 ----- this shows the week of month - which week today's date is in the current month 

    SELECT CONVERT(VARCHAR(10), GETDATE(), 101) + ' ' + CONVERT(VARCHAR(8), GETDATE(), 108)-- format is mm/dd/yyyy hh:mm:ss 

    select CONVERT(VARCHAR(10), GETDATE(), 101) + ' ' + SUBSTRING(convert(varchar, getdate(),108),1,5)-- format is mm/dd/yyyy hh:mm 

    select convert(varchar(10), GETDATE(), 101) + stuff(right(convert(varchar(26),GETDATE(),109),15),7,7,' ')-- format is mm/dd/yyyy hh:mm AM/PM 
    SELECT CONVERT(VARCHAR(10),GETDATE(),101) +' '+ SUBSTRING(CONVERT(VARCHAR(20), GETDATE(), 9), 13, 5) + ' ' + SUBSTRING(CONVERT(VARCHAR(30), GETDATE(), 9), 25, 2)-- format is mm/dd/yyyy hh:mm AM/PM 



    select convert(varchar(10), GETDATE(), 101) + right(convert(varchar(32),GETDATE(),100),8) 
    select CONVERT(VARCHAR(10), GETDATE(), 101) + ' ' + RIGHT(CONVERT(VARCHAR, GETDATE(), 100), 7) 
    select convert(varchar,getDate(),120) 
    select convert(varchar(10),getDate(),120) 



    SELECT convert(varchar, getdate(), 100) -- mon dd yyyy hh:mmAM 
    SELECT convert(varchar, getdate(), 101) -- mm/dd/yyyy 
    SELECT convert(varchar, getdate(), 102) -- yyyy.mm.dd 
    SELECT convert(varchar, getdate(), 103) -- dd/mm/yyyy 
    SELECT convert(varchar, getdate(), 104) -- dd.mm.yyyy 
    SELECT convert(varchar, getdate(), 105) -- dd-mm-yyyy 
    SELECT convert(varchar, getdate(), 106) -- dd mon yyyy 
    SELECT convert(varchar, getdate(), 107) -- mon dd, yyyy 
    SELECT convert(varchar, getdate(), 108) -- hh:mm:ss 
    SELECT convert(varchar, getdate(), 109) -- mon dd yyyy hh:mm:ss:mmmAM (or PM) 
    SELECT convert(varchar, getdate(), 110) -- mm-dd-yyyy 
    SELECT convert(varchar, getdate(), 111) -- yyyy/mm/dd 
    SELECT convert(varchar, getdate(), 112) -- yyyymmdd 
    SELECT convert(varchar, getdate(), 113) -- dd mon yyyy hh:mm:ss:mmm 
    SELECT convert(varchar, getdate(), 114) -- hh:mm:ss:mmm(24h) 
    SELECT convert(varchar, getdate(), 120) -- yyyy-mm-dd hh:mm:ss(24h) 
    SELECT convert(varchar, getdate(), 121) -- yyyy-mm-dd hh:mm:ss.mmm 
    SELECT convert(varchar, getdate(), 126) -- yyyy-mm-ddThh:mm:ss.mmm 
+1

你應該添加更多這顯示它如何回答這個問題。發佈代碼不是答案。解釋它是如何工作的是一個答案。 – yanman1234