【问题标题】:How to compare dates which is stored as String(varchar) in database?如何比较在数据库中存储为 String(varchar) 的日期?
【发布时间】:2014-12-26 11:39:49
【问题描述】:

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

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

谢谢。

【问题讨论】:

  • 为什么datetimes 被存储为varchar
  • 它的旧数据库!所有日期都存储在 varchar 中..我们必须在不更改数据库结构的情况下迁移应用程序..
  • 您必须先决定 - 如果您的数据库是 MySql、SqlServer 还是 Oracle。为什么它们都在标签中?
  • OTOH,它们存储方式的优势(yyyy downto ss)是这些时间戳的字母顺序 === 时间顺序,因此您应该能够测试字符串并获得相同的结果你会的,就像日期一样。
  • DATE 永远不会以任何格式存储。这是我们人类需要理解的。 Oracle 存储DATE 总共7 bytes。其中的每个字节都存储 DATE 元素的值。阅读我的答案。

标签: mysql sql sql-server oracle


【解决方案1】:

只需比较字符串,无需额外开销。

这种格式“YYYY-MM-DD HH:mm:ss”共享时间顺序和字面字​​母顺序

SELECT * FROM someTable
WHERE fromdate >= '2014-09-10 10:10:10' AND todate <= '2014-10-10 10:10:10'

另外,我会在这些列上创建一个索引。

【讨论】:

  • @fvu +1,你说得比我好。我应该说字母而不是文字
【解决方案2】:

我有一个数据库(表),其中 2 个字段是:fromdate varchar(20) 今天的 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(今天)

只需使用to_date('2014-10-30 10:10:10', 'YYYY-MM-DD HH24:MI:SS')

注意这是针对 Oracle 数据库的。我看到你也标记了 SQL Server。我不明白你为什么这样做。

【讨论】:

  • 如我所说,使用to_date
  • 但是您认为日期存储在数据库中的方式是错误的。希望你现在明白我解释了 7 字节的信息。
【解决方案3】:

使用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'

【讨论】:

  • str_to_date 是特定于数据库供应商的吗?
  • 它实际上如何区分存储在 varchar 中的两个日期?
  • 我们几乎拥有所有数据库,我需要一个通用查询..以便它可以在任何数据库上工作..
  • @vineeth.soman:那么您需要为每个数据库引擎提供不同的解决方案。或者你实际上应该做什么 - 将数据类型更改为日期时间,一切都会好起来的 - 你不需要函数调用,它要快得多
  • 实际上我们考虑过..但是数据库包含实时数据..我们还必须合并旧数据...我们的错误
【解决方案4】:

首先,可以使用convert函数:

SELECT CONVERT(Datetime, '2014-10-30 18:00:00', 120) 

第二,如果您不能更改现有列及其类型,并不意味着您不能添加具有正确日期类型的附加列,重复“错误”列的含义.这既可以节省您的旧代码,又可以帮助您进行新的开发,因为查询中的所有转换操作在性能方面都非常昂贵。

【讨论】:

    猜你喜欢
    • 2015-08-14
    • 1970-01-01
    • 1970-01-01
    • 2019-12-03
    • 2017-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多