日期时间中的一个奇怪案例

Gol*_*old 1 sql t-sql sql-server

我有这张桌子 WorkTBL

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
Run Code Online (Sandbox Code Playgroud)

我尝试查找 01/03/2018 和 03/05/2018 之间的记录

我试试这个:

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') 
Run Code Online (Sandbox Code Playgroud)

和这个:

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 
Run Code Online (Sandbox Code Playgroud)

但我只得到这些记录:

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
Run Code Online (Sandbox Code Playgroud)

剩下的在哪里?为什么我没有得到88 27/04/2018 2018-04-27 13:36:06.000例如?

谢谢

Gor*_*off 5

不要将日期/时间转换为字符串进行比较!

去做:

select id, CONVERT(VARCHAR(10), Tdate,1 03), Tdate
from WorkTBL
where Tdate >= '2018-01-03' and 
      Tdate < '2018-05-04'
Run Code Online (Sandbox Code Playgroud)

首先,您的比较是strings。字符串按字母顺序进行比较,这解释了您的结果。

其次,不要between与日期和时间一起使用。Aaron Bertrand 有一篇关于这个主题的非常好的博客

第三,我删除了对日期的转换。通常,在列上使用函数或转换会阻止使用索引。极少数例外之一是将日期时间转换为日期。但是,如果没有转换,代码仍然更简单、更清晰。