sql-server在datetime中一个非常奇怪的例子

时间:2018-05-04 20:21:14

标签: sql sql-server tsql

我有这个表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 例如

感谢

3 个答案:

答案 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);

完整测试查询:https://pastebin.com/Csk1nHsC