【问题标题】:SQL SELECT - order dates with wrong formatSQL SELECT - 格式错误的订单日期
【发布时间】:2022-02-08 19:33:07
【问题描述】:

我的任务是在我们的 Web 应用程序中订购一些条目。 10 年前其他人提出的当前解决方案是在 db 上有一个选择,然后它会迭代并生成表。

问题是,该日期是 dd-mm-yyyy 格式和 varchar 数据。

也不确定,如果我有勇气对数据库进行更改。

那么有没有办法在一个选择中订购它,某种方式在最后订购它?或者只有在代码中不做一些令人毛骨悚然的功能的方法是改变数据库?

【问题讨论】:

  • 更改数据库是迄今为止最明智的想法。我保证没有 CHECK 约束阻止例如29-02-2021 不会被输入。
  • 欢迎来到 Stack Overflow。日期处理因 SQL 的品牌和版本而异。请edit您的标签告诉我们您使用的是哪一个? oracle?, sql-server? mysql? postgresql?或者是什么?有一些方法可以解决这个问题,但它们特定于您使用的 SQL 方言。
  • 我正在使用mysql。

标签: mysql date select


【解决方案1】:

您可以为此使用STR_TO_DATE() 函数。试试

ORDER BY STR_TO_DATE(varcharDateColumn, '%d-%m-%Y')

它将您的字符串日期转换为 DATE 数据类型,在这种数据类型中排序工作没有问题。

从 MySQL 5.7 或更高版本开始,您可以在表中添加所谓的生成列,而无需触及其他数据。

     ALTER TABLE tbl 
      ADD COLUMN goodDate 
              AS (STR_TO_DATE(varcharDateColumn, '%m-%d-%Y'))
          STORED;

如果您需要使用它进行搜索,您甚至可以在该列上放置一个索引。

ALTER TABLE t1 ADD INDEX goodDate(goodDate);

【讨论】:

    【解决方案2】:

    您可以使用STR_TO_DATE 函数,但这仅适用于小表(可能有数千条记录),在大型数据集上您将面临性能问题:

    SELECT * 
    FROM (
      SELECT '01-5-2013' AS Date
      UNION ALL
      SELECT '02-6-2013' AS Date
      UNION ALL
      SELECT '01-6-2013' AS Date
    ) AS t1
    ORDER BY STR_TO_DATE(Date,'%d-%m-%Y')
    

    长期解决方案应该是将该列转换为正确的日期类型。

    【讨论】:

      猜你喜欢
      • 2014-11-21
      • 1970-01-01
      • 2019-08-19
      • 1970-01-01
      • 2020-09-05
      • 2016-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多