我有一个SQL查询,如下所示
select *
from tbltask
where taskstartdate = '2017-02-13 15:23:00.000'
此查询正在执行,我正在获取正确的数据但是,我想使用like
命令而不是=
所以我将查询更改为以下
SELECT *
FROM tblTask
WHERE TaskStartDate LIKE '%2017%'
有了这个,我得到了2017年的数据。
这是我的一行
038815c1-d8b3-43c8-bd28-1bc8cf7c0688 101 30b3af65-3222-42c4-8d6e-25ec275c5ba1 test 2017-02-13 15:23:00.000 2017-02-13 15:23:00.000 testing 2017-02-13 15:23:00.000 NULL WIP 0 0 2 0 1 7788e4b1-e702-4c8a-9dfc-6ce7081f0a93 2017-02-13 15:47:14.747 0 NULL 30b3af65-3222-42c4-8d6e-25ec275c5ba1 1 NULL 0 30b3af65-3222-42c4-8d6e-25ec275c5ba1 0 Low ~/TaskFile/error-bg.jpg 0 NULL 0 0,0,0,0,0,0 0 NULL
但是我想获取特定日期的数据,所以我再次将查询更改为以下内容并获取上面显示的行的数据
SELECT *
FROM tblTask
WHERE TaskStartDate LIKE '%2017-02-13 15:23:00.000%'
但是这显示了空白数据,
我的查询有什么问题?
答案 0 :(得分:0)
您可以使用DATEPART功能提取部分日期。它还应该使您的查询更明确地了解您正在寻求实现的目标:
select *
from tbltask
where
DATEPART(year,taskstartdate )=2017 and
DATEPART(month,taskstartdate ) between 1 and 3
(还有一些特别命名的函数,例如MONTH和YEAR,但我更喜欢DATEPART的一致性,因为它可以访问日期时间的所有组件)
您应该尽量避免将日期时间视为具有任何类型的字符串格式。将它们视为字符串是我们遇到的最大错误来源之一。
答案 1 :(得分:0)
根据您的场景使用Like
运算符使用下一个代码: -
SELECT *
FROM #tblTask
WHERE convert(datetime2,TaskStartDate) LIKE '%2017-02-13 15:23:00.000%'
注意:使用带有日期的Like
运算符不是最佳做法,请改用DATEPART。
答案 2 :(得分:0)
使用日期投射。它会解决你的问题。
CAST(TaskStartDate AS DATETIME) = CAST('2017-02-13 15:23:00.000'AS DATETIME)
答案 3 :(得分:0)
您可以使用BETWEEN来查找该范围之间的数据
SELECT *
FROM tblTask
WHERE TaskStartDate BETWEEN '2017-02-13 00:00:00.000' AND '2017-02-13 23:59:59.000'
答案 4 :(得分:0)
在datetime列上应用like运算符并不好。它不会使用索引。当您使用like运算符时,您需要查询类似下面的内容。
select *
from tbltask
where CONVERT(CHAR(8), taskstartdate, 112) like '%20170213%'
注意:上述查询将选择日期为2017-02-13的所有行,而不考虑时间。
为了获得更好的性能,请使用以下查询
select *
from tbltask
where taskstartdate>= '2017-02-13' and taskstartdate<'2017-02-14'