2010-09-08 52 views
1

我有日期的列,但它是一個varchar:sql server:我的日期數據有什麼問題?

8/31/2010 9:48 
8/31/2010 9:49 
8/31/2010 9:51 
8/31/2010 9:52 
8/31/2010 9:55 
8/31/2010 9:59 
8/31/2010 10:11 
8/31/2010 10:13 
8/31/2010 10:16 
8/31/2010 10:37 
8/31/2010 10:42 

我確信,這些都不會有錯誤的日期:

SELECT * 
FROM qcvalues.dbo.batchinfo 
WHERE ISDATE(reporttime) <> 1 

這個返回0結果

問題: 我需要返回一定範圍之間的日期:

select rowid from qcvalues.dbo.batchinfo where CONVERT(DATE, Substring(reporttime, 1, LEN(reporttime)), 103) 
    between cast('2010-08-01' as datetime) and CAST('2010-08-31' as datetime) 

我收到這個錯誤;

Msg 241, Level 16, State 1, Line 2 
Conversion failed when converting date and/or time from character string. 

我的轉換出了什麼問題?

+0

你爲什麼使用從1到字符串長度的子字符串函數?你打算在空格分隔符處切斷它嗎? – Beth 2010-09-08 16:04:54

+0

你也可以通過直接字符串比較而不用將任何東西轉換成日期(reporttime>'8/1/2010'和reporttime <'8/31/2010') – Beth 2010-09-08 16:06:16

+0

把101而不是103的人是對的,但是他們刪除了他們的答案 – 2010-09-08 16:16:18

回答

1

這將解決你的問題:

select rowid 
from qcvalues.dbo.batchinfo 
where 
    CONVERT(DATE, reporttime, 101) >= '20100801' 
    -- style 101, not 103 
    -- also notice date conversion invariant format YYYYMMDD with no separators 
    AND CONVERT(DATE, reporttime, 101) < '20100901' 
    -- using BETWEEN with an end date of '8/31/2010' will skip 
    -- times between '8/31/2010 00:00:00.003' and '8/31/2010 23:59:59.997' 

試試這個看問題是什麼:

select convert(datetime, '8/31/2010 9:48', 103) 
select convert(datetime, '8/31/2010 9:48', 101) 
1

在查詢之前放置SET DATEFORMAT MDY。

+0

哇,真的嗎?但它不是Oracle的to_date函數的競爭對手。我們需要這個功能在我們的領域。因爲,我總是喜歡......這個日期是121還是112,甚至是104? – 2010-09-08 16:10:34

2

如果需要存儲日期,然後在未來

做這項工作使用日期時間列?

WHERE CONVERT(DATE,RTRIM(reporttime)) 
BETWEEN '2010-08-01' and '2010-08-31' 

如果運行它

之前,如果你必須將它存儲在VARCHAR列,然後使用YYYYMMDD格式不使用SET DATEFORMAT MDY ...這樣,你可以做

WHERE reporttime like '201008%'如果您想要八月2010

+0

+1,000,000 **如果您需要存儲日期,則可以使用未來的日期時間列** – 2010-09-08 18:06:57

0

請記住,這CAST('2010-08-31' as datetime)將有其時間部分爲00:00

考慮將您的varchar數據轉換爲smalldatetime,並具體說明兩者之間的時間邊界。不需要轉換,子串等。只需要一個CAST即可。

認爲這是一個潛在的解決方案:

SELECT rowid from qcvalues.dbo.batchinfo 
WHERE CAST(reporttime as smalldatetime) 
BETWEEN '2010-08-01' AND '2010-08-31 23:59' 
+2

,我喜歡reporttime> ='2010-08-01'和reporttime <'2010-09-01'之間的比較好。 – Beth 2010-09-08 17:17:51

+0

@貝絲:太棒了! – 2010-09-08 17:25:28

0

這將剝離出一部分時間太

select rowid 
    from qcvalues.dbo.batchinfo 

    Where cast(floor(cast(cast(reportTime as datetime)as float))as datetime) 

    between cast('2010-08-01' as datetime) 
    and  cast('2010-08-31' as datetime)