Sql 获取存储为十进制的日期之间的值
我正在使用一个数据库,其中日期存储为十进制值。例如,2019年9月1日存储为20190901 在select语句中,我可以将字段转换为常规日期。但是,当我尝试使用BETWEEN时,仍然会显示超出范围的值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
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
子句中输入了错误的常量。