Sql 获取存储为十进制的日期之间的值

Sql 获取存储为十进制的日期之间的值,sql,decimal,between,Sql,Decimal,Between,我正在使用一个数据库,其中日期存储为十进制值。例如,2019年9月1日存储为20190901 在select语句中,我可以将字段转换为常规日期。但是,当我尝试使用BETWEEN时,仍然会显示超出范围的值 select distinct balanceDate, cast(CAST(balanceDate AS VARCHAR(8)) as date)AS balDate from balanceTable where balanceDate BETWEEN '20190301' AND '2

我正在使用一个数据库,其中日期存储为十进制值。例如,2019年9月1日存储为20190901

在select语句中,我可以将字段转换为常规日期。但是,当我尝试使用BETWEEN时,仍然会显示超出范围的值

select distinct balanceDate, cast(CAST(balanceDate AS VARCHAR(8)) as date)AS 
balDate 
from balanceTable
where balanceDate BETWEEN '20190301' AND '20190901'
结果:显示余额日期为20191031的行


我应该在where子句中使用cast吗

还没有使用cast,但如果它对您同样有效,您可以在下面进行尝试

  select distinct TO_DATE(TO_CHAR( 
      balanceDate), 'YYYYMMDD')) 
     , 
   cast(CAST(balanceDate AS 
   VARCHAR(8)) as date)AS 
    balDate 
    from balanceTable
    where TO_DATE(TO_CHAR( 
      balanceDate), 'YYYYMMDD')) 
     BETWEEN 
      '20190301' AND '20190901'

您需要在零件所在位置应用铸件,而不是选择零件

select distinct balanceDate, cast(CAST(balanceDate AS VARCHAR(8)) as date) AS balDate 
from balanceTable
where convert(varchar,CAST(balanceDate AS VARCHAR(8),112) BETWEEN '20190301' AND '20190901'

但请考虑使用函数防止索引使用,因此此查询进行全表扫描。


注意:对于SQL Server,答案是一致的。如果所有日期都有int数据类型,那么比较int会更快。尝试:

select distinct balanceDate
from balanceTable
where balanceDate BETWEEN 20190301 AND 20190901

使用to_date可转换为日期类型。请再次阅读我的答案。您看不到itSo字段中的to_date
balanceDate
是整数类型还是varchar(可能是固定长度)?你在运行什么数据库管理系统?你在使用什么产品?“SQL”只是一种查询语言,而不是特定数据库产品的名称。对于您正在使用的数据库产品,
postgresql
oracle
sql server
db2
,…日期值应存储在定义为
Date
的列中,而不是十进制或varchar或其他任何列中。您遇到的问题是设计决策失误的直接结果。您需要确认BalanceDate列的数据类型。你说它是一个十进制数,但你是在将它与字符串进行比较(
balanceDate介于'20190301'和'20190901'
)。@Michelle。我想不出20191031会以这两个边界出现的情况,不管列的类型如何。我怀疑您只是在
where
子句中输入了错误的常量。