如何比较在数据库中存储为String(varchar)的日期?

时间:2014-10-30 12:21:30

标签: mysql sql sql-server oracle

我有一个数据库(表),其中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)

如何获取所有准确的记录..   有什么解决方案..

感谢。

4 个答案:

答案 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)

使用STR_TO_DATE()

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;柱。这将既保存您的遗留代码又可以帮助您进行新的开发,因为在查询中进行转换的所有操作在性能方面都非常昂贵。