SQL 日期范围规范,显式与 BETWEEN()
SQL Date Range Specification, Explicit vs BETWEEN()
我对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
正如我指出的那样,这是我的代码中输入错误的结果
我正在将生产中的某些东西与请求的更改进行比较。
谢谢你的眼光,我周六的时候眼睛明显看的太累了
The correct dates are being returned but the data is different.
你说得好像 data 是一样的,但是结果集有不同的顺序。除非您的查询有 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'
此版本适用于日期和 date/time 值。
无论使用何种查询语法,您的日期范围都不相同
'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'
但是描述日期范围的最安全方法是使用 >=
和 <
的组合,如:
WHEN reading_start_dt >= '2019-02-09' AND
reading_start_dt < '2019-02-16' -- note the increase of date here
无论时间数据有多精确,后一种方法都能准确工作
我对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
正如我指出的那样,这是我的代码中输入错误的结果
我正在将生产中的某些东西与请求的更改进行比较。
谢谢你的眼光,我周六的时候眼睛明显看的太累了
The correct dates are being returned but the data is different.
你说得好像 data 是一样的,但是结果集有不同的顺序。除非您的查询有 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'
此版本适用于日期和 date/time 值。
无论使用何种查询语法,您的日期范围都不相同
'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'
但是描述日期范围的最安全方法是使用 >=
和 <
的组合,如:
WHEN reading_start_dt >= '2019-02-09' AND
reading_start_dt < '2019-02-16' -- note the increase of date here
无论时间数据有多精确,后一种方法都能准确工作