我有一个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)
但是我看到它返回所有行(即使那些不包含该日期)
答案 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