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