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

Tsql T-SQL如何检查DataTime是否包含日期字符串?,tsql,Tsql,我有一个DateTime列行,我声明了一个日期字符串: 行: 我的字符串: '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_

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

行:

我的字符串:

'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)
但我看到它返回所有行(即使不包含该日期的行)

Sql server:


这样,它也可以使用索引,不要在列本身上使用函数。。它不是
SARGable

where import_date >= convert(datetime,@year + @month + @day)
and import_date < convert(datetime,@year + @month + @day) + 1
其中导入日期>=转换(日期时间,@year+@month+@day)
导入日期
最好的方法是使用日期,而不是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
将@year声明为NVARCHAR(4)
宣布@month为NVARCHAR(2)
宣布@day为NVARCHAR(2)
设置@year='2010'
设置@month='08'
设置@day='23'
声明@date-DATETIME
如果ISDATE(@年+月+日)=0
开始
RAISERROR('传入的值不是有效日期',16,1)
返回
结束
其他的
开始
设置@date=@年+@月+@日
结束
从[dbo].[customer\u import]CsrImport中选择*
其中导入日期>=@date
和导入日期<@date+1

应该可以,如果您将值设为int如何

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子句。

只需将datestring转换为date(或datetime)变量并使用where子句: 因为你的桌子上有时间,你必须把它们去掉,或者把它们和前后的午夜进行比较

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

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


如果使用这种方法,请确保正确定位。第一个语句将在英国格式下工作,但在美国格式下将在2007年第30个月的第2个月失败,这当然会失败。好的评论,是否还需要将其转换为局部变量并在where子句中使用。SQL编译器中的Optimation现在能做到这一点吗?
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)
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