我想知道如何使用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'
我得到了错误的记录。为什么?
答案 0 :(得分:2)
您似乎在数据库中将时间戳保存为TEXT
或VARCHAR
。如果是这样,您就不能这样做。这是一个非常糟糕的方法。请改用类型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')