T-SQL如何检查DateTime是否包含日期字符串?

时间:2010-08-27 13:06:33

标签: tsql

我有一个DateTime列行,我声明了一个日期字符串:

行:

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)

但是我看到它返回所有行(即使那些不包含该日期)

4 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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 >=@date
AND import_date < @date + 1

答案 2 :(得分:1)

这应该有用,如果你设定值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子句。

答案 3 :(得分:0)

只需将日期字符串转换为日期(或日期时间)变量并使用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