从DB2SQL中的日期范围中选择数据

从DB2SQL中的日期范围中选择数据,sql,db2,Sql,Db2,我在尝试获取DB2SQL中的数据时遇到困难。 我有一个表名StProdMoves,它包含如下数据 ProdName | Status | Brand | Type | Date(Numeric) ----------+---------+-------+-------+----------- ORANGE | 10 | SBR | IN | 20181217105640 APPLE | 10 | SBR | IN | 2018122014

我在尝试获取DB2SQL中的数据时遇到困难。 我有一个表名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
 ProdName | Status  | Brand |  DateIn  | DateOut
----------+---------+-------+-------+-----------
ORANGE    | 10      |  SBR  | 20181217 | ---
APPLE     | 10      |  SBR  | 20181220 | ---
PEAR      | 10      |  SBR  | 20181120 | 20190106
现在,如果要从一个日期范围中选择两个日期之间的销售数据,查询是什么

例如,我想选择在2018年12月31日和2019年1月7日之间,品牌=SBR,状态=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 | 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
 ProdName | Status  | Brand |  DateIn  | DateOut
----------+---------+-------+-------+-----------
ORANGE    | 10      |  SBR  | 20181217 | ---
APPLE     | 10      |  SBR  | 20181220 | ---
PEAR      | 10      |  SBR  | 20181120 | 20190106
你可以试试下面的

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

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

如果列Date的格式类似于VARCHARn、CHARACTERn等,那么根据它们的格式,可以进行如下字符串比较:

DateColumn >= '2018-12-31' and DateColumn < '2019-01-06'
如果您处理的是时间戳:

编辑

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

DateColumn >= 20181231000000 and DateColumn < 20190106000000
注意:像RDBMS函数或数据类型这样命名列通常不是一个好主意。我在示例中将您的列从Date重命名为DateColumn。

如果您的日期是以您提供的格式作为数值的,则使用日期参数查询表的最有效方法如下所示:

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'));
我们以这种方式将日期输入参数转换为数据的数字时间戳表示。

如何

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

还要指定预期的结果。列日期的数据类型是什么?列日期的数据类型是数字,但我可以使用DATETO_DATESUBSTRDIGITSDate,1,8,'YYYYMMDD'@Taikun转换为日期:给定数字的格式,您可以简单地进行数字比较。。。请参阅我的更新答案。我已经更新了信息,我正在尝试更具体一些。DateColumn>20181231000000在DB2forLUW和DB2forIBMi中不起作用。以下工作,例如:DateColumn>Timestamto_char20181231000000。如果您的上一个示例真的有效,那么您的Db2版本和平台是什么?@MarkBarinstein:这个表达式用于回答DateColumn是数字而不是类似日期的数据类型的情况。这在这种特殊情况下不起作用吗?抱歉,我在您的示例中忽略了DateColumn的数据类型。特别是在这里,日期/时间查询的下限应为包含下限的值>=,否则您将在午夜删除任何内容。日期/时间查询的下限,特别是在这里,应为包含下限的值>=,或者你会在午夜放弃任何东西。日期/时间查询的上限,特别是在这里,应该是唯一的上限,