从DB2 SQL中的日期范围选择数据

时间:2019-04-07 21:38:51

标签: sql db2

尝试在DB2 SQL中获取数据时遇到麻烦。 我有一个名为StProdMoves的表,它包含这样的数据

ProdName | Status  | Brand | Type  | Date(Numeric)
----------+---------+-------+-------+-----------
ORANGE    | 10      |  SBR  |  IN   | 20181217105640
APPLE     | 10      |  SBR  |  IN   | 20181220143520
GARLIC    | 20      |  SBR  |  IN   | 20190107095740
APPLE     | 20      |  JUM  |  OUT  | 20190107121050
ORANGE    | 20      |  AUR  |  OUT  | 20190110164530
ORANGE    | 20      |  AUR  |  IN   | 20190110000000
GARLIC    | 10      |  SBR  |  OUT  | 20190211000000

如果要从日期范围中的两个日期之间选择销售数据,现在要查询什么?

例如,我要选择停留在31/12/201807/01/2019范围内,并且brand = SBR和Status = 10的产品。

编辑: 我尝试使用此查询获取数据,但并非所有选择的产品都显示在该日期范围内,然后显示如下结果:

SELECT * FROM StProdMoves WHERE DATE(TO_DATE(SUBSTR(DIGITS(Date), 1, 8), 'YYYYMMDD')) BETWEEN '31/12/2018' AND '07/01/2019' AND Brand='SBR' AND Status=10

以后以ProducName,Status,Brand,DateIn和DateOut表示在此日期或日期范围内存在的所有产品,例如

 ProdName | Status  | Brand |  DateIn  | DateOut
----------+---------+-------+-------+-----------
ORANGE    | 10      |  SBR  | 20181217 | ---
APPLE     | 10      |  SBR  | 20181220 | ---
PEAR      | 10      |  SBR  | 20181120 | 20190106

4 个答案:

答案 0 :(得分:1)

如果您使用提供的格式将日期作为Numeric值,则使用DATE参数查询表的最有效方法应如下:

select *
from (
          select 20181217105640 from sysibm.sysdummy1
union all select 20181220143520 from sysibm.sysdummy1
) StProdMoves (DateNumeric)
where 
    DateNumeric > bigint(varchar_format(DATE('2018-12-18'), 'YYYYMMDDHH24MISS'))
and DateNumeric < bigint(varchar_format(DATE('2019-01-06'), 'YYYYMMDDHH24MISS'));

我们以这种方式将Date输入参数转换为数据的Numeric时间戳表示。

答案 1 :(得分:0)

您可以尝试关注

select * from StProdMoves where Date >= '2018-12-31' and Date <= '2019-01-06'

答案 2 :(得分:0)

这个问题是关于如何形成查询的WHERE子句的。


如果列Datestring datatype的列(例如VARCHAR(n)CHARACTER(n)等),则根据其格式,可以进行字符串比较喜欢:

DateColumn >= '2018-12-31' and DateColumn < '2019-01-06'

如果您实际上正在处理DATE datatype,则可以在比较之前将字符串转换为相应的数据类型,例如:

DateColumn >= DATE('2018-12-31') and DateColumn < DATE('2019-01-06')

如果要处理TIMESTAMP,则为:

DateColumn >= TIMESTAMP('2018-12-31 00:00:00') AND DateColumn < TIMESTAMP('2019-01-06 00:00:00')

编辑

如果要处理数字数据类型(如已编辑的问题中所示),那么您可以简单地进行数字比较:

DateColumn >= 20181231000000 and DateColumn < 20190106000000

注意:通常不建议使用RDBMS函数或数据类型之类的列命名。在示例中,我将您的列从Date重命名为DateColumn

答案 3 :(得分:0)

怎么样

SELECT * FROM "StProdMoves"
WHERE "Date(Numeric)" BETWEEN DECIMAL(DATE('2018-12-31')) * 1000000  
                          AND DECIMAL(DATE('2019-01-07')) * 1000000 + 999999