1

我对 SQL 的理解是

WHEN reading_start_dt BETWEEN '2020-02-09' AND '2020-02-15'

是相同的

WHEN reading_start_dt >= '2019-02-09' AND reading_start_dt <= '2019-02-15'

但是当查询中唯一的区别是日期范围规范时,我得到了完全不同的结果集。
正在返回正确的日期,但数据不同。
Teradata 和 HANA 都在发生这种情况。

我错过了什么吗?

编辑:


SELECT meter_id, reading_meas, reading_interval_start_dttm FROM "_SYS_BIC"."NGDW.SM.PVT/METER_READING"  
WHERE Reading_Start_Dt BETWEEN '2020-02-09' AND '2020-02-15' AND Service_Channel_num = 1 AND Meter_id = 11870690   
ORDER BY Reading_Interval_Start_Dttm

在此处输入图像描述


SELECT meter_id, reading_meas, reading_interval_start_dttm FROM "_SYS_BIC"."NGDW.SM.PVT/METER_READING"  
WHERE reading_start_dt >= '2019-02-09' AND reading_start_dt <= '2019-02-15' AND service_channel_num = 1 AND meter_id = 11870690  
ORDER BY Reading_Interval_Start_Dttm

在此处输入图像描述

正如所指出的,这是我的代码中出现拼写错误的结果,
我正在将生产中的某些内容与请求的更改进行比较。谢谢你的敏锐眼睛,星期六我的眼睛显然太累了,看不到它。

4

2 回答 2

3

无论使用何种查询语法,您的日期范围都不相同

'2020-02-09' AND '2020-02-15' -- the year is 2020
'2019-02-09' AND '2019-02-15' -- the year here is 2019

这些在语法上是等效的:

WHEN reading_start_dt BETWEEN '2019-02-09' AND '2019-02-15'

WHEN reading_start_dt >= '2019-02-09' AND
     reading_start_dt <= '2019-02-15'

但描述日期范围最安全的方法是使用 with 的组合,>=如下<所示:

WHEN reading_start_dt >= '2019-02-09' AND
     reading_start_dt < '2019-02-16' -- note the increase of date here

无论时间数据有多精确,后一种方法都能准确地工作

于 2020-02-23T01:43:25.620 回答
1

正在返回正确的日期,但数据不同。

你让它听起来数据是相同的,但结果集有不同的顺序。除非您的查询有order by子句,否则数据可以按任何顺序返回。

这两个过滤器完全相同:

WHEN reading_start_dt BETWEEN '2020-02-09' AND '2020-02-15'

WHEN reading_start_dt >= '2019-02-09' AND
     reading_start_dt <= '2019-02-15'

但是,我建议将逻辑编写为:

WHEN reading_start_dt >= '2019-02-09' AND
     reading_start_dt < '2019-02-16'

此版本适用于日期和日期/时间值。

于 2020-02-22T22:15:22.100 回答