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
例如?
谢谢
不要将日期/时间转换为字符串进行比较!
去做:
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 有一篇关于这个主题的非常好的博客。
第三,我删除了对日期的转换。通常,在列上使用函数或转换会阻止使用索引。极少数例外之一是将日期时间转换为日期。但是,如果没有转换,代码仍然更简单、更清晰。
归档时间: |
|
查看次数: |
66 次 |
最近记录: |