在两个日期之间获取数据

时间:2018-11-16 06:00:05

标签: sql oracle

我想知道如何使用SQL查询在两个日期之间获取数据。在我的表格中,日期格式为dd/mm/yyyy hh:mm:ss am/pm

根据这些日期格式,我需要获取数据。列是DATE类型。

我尝试了以下查询

select * from sales 
where to_char(txn_date, 'dd-mm-yyyy' ) 
between '10-09-2018' and '30-09-2018'

我得到了错误的记录。为什么?

4 个答案:

答案 0 :(得分:2)

您似乎在数据库中将时间戳保存为TEXTVARCHAR。如果是这样,您就不能这样做。这是一个非常糟糕的方法。请改用类型DATETIME,这样您就可以使用BETWEEN运算符。

使用DATETIME类型时,您可以

SELECT *
FROM sales
WHERE txn_date BETWEEN '2018-01-01 00:00:00' AND '2018-12-31 23:59:59'

这将为您提供2018年的所有数据,并且仍在使用您的索引

编辑

由于您现在已经告知您将DATE用作数据类型,因此可以在没有时间的情况下使用相同的解决方案。

SELECT *
FROM sales
WHERE txn_date BETWEEN '2018-01-01' AND '2018-12-31'

答案 1 :(得分:0)

由于将日期转换为字符串,因此记录不正确。这意味着查询在进行比较时会使用字符串语义。 '15-12-2999''15-05-2000作为字符串,在'10-09-2018''30-09-2018'之间,因为'15'的ASCII值比'10'高,而ASCII值低比'30'

解决方案非常简单:使用日期数据类型进行比较。

select * from sales 
where txn_date between date '2018-09-10' and date '2018-09-30'

如果TXN_DATE具有时间元素,则您可能希望将查询更改为

select * from sales 
where txn_date >= date '2018-09-10' 
and txn_date < date '2018-10-01'

否则,您将不会检索9月30日午夜之后进行的交易记录。

或者,您可以通过截断日期来删除时间元素:

select * from sales 
where trunc(txn_date) between date '2018-09-10' and date '2018-09-30'

答案 2 :(得分:0)

从销售中选择* 其中trunc(txn_date) 在'10 -09-2018'和'30 -09-2018'之间,如果您使用日期/时间截断格式,则会消除日期中的时间

答案 3 :(得分:0)

最后我得到了这个问题的答案 从销售中选择* txn_date在to_date('01 -10-2018 00:00:00','DD-MM-YYYY HH24:MI:SS')和to_date('31 -10-2018 23:59:59' ,'DD-MM-YYYY HH24:MI:SS')