我有这个表WorkTBL
$prod_id
我试图在01/03/2018和03/05/2018之间寻找记录
我试试这个:
id MyDate Tdate
84 27/04/2018 2018-04-27 13:35:09.000
85 27/04/2018 2018-04-27 13:35:09.000
86 27/04/2018 2018-04-27 13:35:09.000
88 27/04/2018 2018-04-27 13:36:06.000
89 27/04/2018 2018-04-27 13:36:06.000
90 27/04/2018 2018-04-27 13:36:06.000
91 27/04/2018 2018-04-27 13:36:06.000
92 27/04/2018 2018-04-27 13:40:00.000
93 27/04/2018 2018-04-27 13:40:00.000
95 02/05/2018 2018-05-02 16:03:22.000
96 02/05/2018 2018-05-02 16:03:22.000
98 02/05/2018 2018-05-02 16:04:35.000
102 04/05/2018 2018-05-04 22:57:42.000
103 04/05/2018 2018-05-04 22:57:42.000
104 04/05/2018 2018-05-04 22:57:42.000
和此:
select id,CONVERT(VARCHAR(10),Tdate,103),Tdate from WorkTBL
where (CONVERT(VARCHAR(10),Tdate,103) >= '01/03/2018' and CONVERT(VARCHAR(10),Tdate,103) <= '03/05/2018')
但我只得到这些记录:
select id,CONVERT(VARCHAR(10),Tdate,103),Tdate from WorkTBL
where (CONVERT(VARCHAR(24),Tdate,103) between '01/03/2018' and '03/05/2018') order by id desc
其余的在哪里?为什么我没有95 02/05/2018 2018-05-02 16:03:22.000
96 02/05/2018 2018-05-02 16:03:22.000
98 02/05/2018 2018-05-02 16:04:35.000
例如
感谢
答案 0 :(得分:4)
始终使用ANSI SQL标准日期格式 YYYYMMDD
select id, CONVERT(VARCHAR(10),Tdate,103) Tdate
from WorkTBL
where cast(Tdate as date) >= '20180103' and
cast(Tdate as date) <= '20180503'
order by id desc;
答案 1 :(得分:4)
请勿将日期/时间转换为字符串进行比较!
Go for:
select id, CONVERT(VARCHAR(10), Tdate,1 03), Tdate
from WorkTBL
where Tdate >= '2018-01-03' and
Tdate < '2018-05-04'
首先,您的比较是字符串。字符串按字母顺序进行比较,这可以解释您的结果。
其次,不要将between
与日期和时间一起使用。 Aaron Bertrand在这个问题上有很好的blog。
第三,我删除了转换为日期。通常,在列上使用函数或转换会阻止使用索引。极少数例外之一是将日期时间转换为日期。但是,如果没有转换,代码仍然更简单,更清晰。
答案 2 :(得分:1)
正确答案已被接受,但是,为了清楚地了解您的问题,请使用此:
select
[id] = [id]
,[MyDate] = convert(datetime, [MyDate], 103)
,[Tdate] = convert(datetime, [Tdate], 121)
from
[#WorkTBL]
where
convert(datetime, [Tdate], 121) > convert(datetime, '01/03/2018', 103)
and convert(datetime, [Tdate], 121) < convert(datetime, '03/05/2018', 103);