【问题标题】:SQL Date Range Specification, Explicit vs BETWEEN()SQL 日期范围规范,显式与 BETWEEN()
【发布时间】:2023-03-25 08:40:01
【问题描述】:

我对 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 &gt= '2019-02-09' AND reading_start_dt &lt= '2019-02-15' AND service_channel_num = 1 AND meter_id = 11870690  
ORDER BY Reading_Interval_Start_Dttm

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

【问题讨论】:

  • 返回的是正确的日期,但数据不同。:你是什么意思?一个最小的可重现示例可能有助于演示您的问题。
  • 请截图相关数据,并确保结果集是相同的,它是一个稳定的orderby(唯一)并且没有十亿行的结果;只需 10 个演示点就可以了
  • 您的年份不同(第一个代码 sn-p 为 2020,第二个代码为 2019)。或者这只是一个错字?
  • 这是一个错字

标签: sql teradata teradata-sql-assistant hana-sql-script hana-studio


【解决方案1】:

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

您听起来像 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'

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

【讨论】:

    【解决方案2】:

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

    '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'
    

    但描述日期范围最安全的方法是使用&gt;=&lt; 的组合,如下所示:

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

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

    【讨论】:

    • 备注:写入日期的安全方式(根据标准 SQL)是 日期文字,Teradata 和 HANA 都支持:BETWEEN DATE '2019-02-09' AND。这需要YMD 格式,从而避免可能的转换错误。
    • 谢谢,关于使用日期文字的要点。我更多地考虑了日期范围的构建,而 Hana 和 Teradata 都不是我的专长。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-18
    • 2016-10-25
    • 1970-01-01
    • 2017-12-20
    • 2015-03-15
    相关资源
    最近更新 更多