我有一个数据库(表),其中2个字段是: fromdate varchar(20) todate varchar(20)
日期以这种方式存储 YYYY-MM-DD HH:mm:ss
例如:“2014-10-30 10:10:10”在数据库中。
现在我想比较两个日期并使用查询从数据库中获取记录, 2014-09-10 10:10:10(fromdate)至2014-10-10 10:10:10(todate)
如何获取所有准确的记录.. 有什么解决方案..
感谢。
答案 0 :(得分:2)
我有一个数据库(表),其中2个字段是:fromdate varchar(20) todate varchar(20)
这是一个设计缺陷。日期应始终为DATE
数据类型,永远不应为字符串。
日期以这种方式存储YYYY-MM-DD HH:mm:ss
DATE
永远不会以任何格式存储。对我们来说,人类要理解。
Oracle将DATE
总共存储为7 bytes
。其中的每个字节都存储DATE元素的值,如下所示:
Byte Description
---- -------------------------------------------------
1 Century value but before storing it add 100 to it
2 Year and 100 is added to it before storing
3 Month
4 Day of the month
5 Hours but add 1 before storing it
6 Minutes but add 1 before storing it
7 Seconds but add 1 before storing it
例如:“2014-10-30 10:10:10”在数据库中。
现在我想比较两个日期并从中获取数据库 使用查询,2014-09-10 10:10:10(fromdate)到2014-10-10 10时10分10秒(TODATE)
只需使用to_date('2014-10-30 10:10:10', 'YYYY-MM-DD HH24:MI:SS')
注意这适用于Oracle数据库。我看到你也标记了SQL Server。我不明白你为什么这样做。
答案 1 :(得分:1)
select * from your_table
where str_to_date(fromdate, '%Y-%m-%d %H:%i:%s') >= '2014-09-10 10:10:10'
and str_to_date(todate, '%Y-%m-%d %H:%i:%s') <= '2014-10-10 10:10:10'
答案 2 :(得分:1)
只需比较字符串,无需额外开销。
此格式&#34; YYYY-MM-DD HH:mm:ss&#34;按时间顺序和字面按字母顺序分享
SELECT * FROM someTable
WHERE fromdate >= '2014-09-10 10:10:10' AND todate <= '2014-10-10 10:10:10'
另外,我会在这些列上创建一个索引。
答案 3 :(得分:0)
首先,您可以使用convert
功能:
SELECT CONVERT(Datetime, '2014-10-30 18:00:00', 120)
第二,如果您无法更改现有列及其类型,则并不意味着您无法添加具有正确日期类型的其他列,这些列重复了&#34;错误&#34;柱。这将既保存您的遗留代码又可以帮助您进行新的开发,因为在查询中进行转换的所有操作在性能方面都非常昂贵。