2010-08-27 92 views
0

我有一個DateTime列行,我宣佈一個日期字符串:T-SQL如何檢查DataTime是否包含日期字符串?

行:

2010-08-27 13:45:55 

我的字符串:

'2010-08-27' 

我如何檢查,如果該字符串是該行嗎?

我嘗試以下查詢:

declare @year as nvarchar(4) 
declare @month as nvarchar(2) 
declare @day as nvarchar(2) 

set @year = '2010' 
set @month = '08' 
set @day = '23' 

select * FROM [dbo].[customer_import] CsrImport 

where 
    (YEAR(CsrImport.import_date) = @year 
     AND MONTH(CsrImport.import_date) = @month 
     AND DAY(CsrImport.import_date) = @day) 

,但我看到它返回(未包含日期偶數)的所有行

回答

3

的SQL Server:ISDATE (Transact-SQL)

----Invalid date 
SELECT ISDATE('30/2/2007') 
RETURNS : 0 (Zero) 
----Valid date 
SELECT ISDATE('12/12/20007)' 
RETURNS : 1 (ONE) 
----Invalid DataType 
SELECT ISDATE('SQL') 
RETURNS : 0 (Zero) 
+0

如果你使用這種方法,確保您得到您的本地化的權利。第一個聲明將以英國格式工作,但美國格式將在2007年30個​​月中的第二個聲明失敗,當然這將失敗。 – 2010-08-27 13:13:08

+1

select ISDATE(2000) – SQLMenace 2010-08-27 13:15:05

3

像這,這也將能夠使用索引,不使用功能的列本身..它不是SARGable

where import_date >= convert(datetime,@year + @month + @day) 
and import_date < convert(datetime,@year + @month + @day) + 1 

最好的方法是使用日期而不是3個不同的參數,如果某人在13個月通過了該怎麼辦?

這裏是一個將檢查所傳遞的值可以被轉換爲日期,如果沒有它會顯示一個錯誤信息

DECLARE @year AS NVARCHAR(4) 
DECLARE @month AS NVARCHAR(2) 
DECLARE @day AS NVARCHAR(2) 

SET @year = '2010' 
SET @month = '08' 
SET @day = '23' 


DECLARE @date DATETIME 
IF ISDATE(@year + @month + @day) = 0 
    BEGIN 
     RAISERROR('values passed in are not a valid date',16,1) 
     RETURN 
    END 
ELSE 
    BEGIN 
     SET @date = @year + @month + @day 
    END 
SELECT * FROM [dbo].[customer_import] CsrImport 
WHERE import_date >[email protected] 
AND import_date < @date + 1 
+0

好評,是否有任何需要做更多的轉換成本地變量,並在where子句中使用。 SQL編譯器中的optimistaion現在可以做到這一點嗎? – 2010-08-27 13:21:31

1

這應該工作,howabout如果你把這些值INTS的例子

declare @year as INT 
declare @month as INT 
declare @day as INT 

set @year = 2010 
set @month = 08 
set @day = 23 

select * FROM [dbo].[customer_import] CsrImport 

where 
    (YEAR(CsrImport.import_date) = @year 
     AND MONTH(CsrImport.import_date) = @month 
     AND DAY(CsrImport.import_date) = @day) 

編輯:確保所有的語句也突出顯示,當你也運行它。就像看起來那麼簡單,如果你突出顯示陳述,是否有可能使用where子句。

0

只要打開datestring爲日期(或日期時間)變量和使用where子句: 由於您的表中有時間,你要帶他們出去或前後比較它們midnioght

Declare @myDate DateTime 
Set @myDate = 'August 23 2010' 

Select * FROM [dbo].[customer_import] CsrImport 
Where DateDiff(day, myDate,import_date) = 0 -- Not Sargable 

Declare @myDate DateTime 
Set @myDate = 'August 23 2010' 

Select * FROM [dbo].[customer_import] CsrImport 
Where import_date) Between @mydate And @Mydate + 1 -- Sargable 
+0

@Vash正在編輯中... – 2010-08-27 13:21:59

相關問題