【问题标题】:How to sort dates of three columns and get rows of all these rows?如何对三列的日期进行排序并获取所有这些行的行?
【发布时间】:2023-03-31 02:14:01
【问题描述】:

我有一个这样的 MySQL 表。

    |------------------------------------------------------------------------------|
    | NAME               |  DateType   |    date1    |     date2    |     date3    |
    |------------------------------------------------------------------------------|
    | Joe Bloggs         |  d1         |  21-09-2020 |  00-00-0000  |  00-00-0000  |
    | Bob Bobbing        |  d3         |  00-00-0000 |  23-11-2020  |  21-09-2010  |
    | etc... ----------------------------------------------------------------------|

我想要的是,合并这些日期,对它们进行排序并得到如下结果:

|-------------------------------------------------|
| NAME               |  DateType   |    date      |
|-------------------------------------------------|
| Joe Bloggs         |  d1         |  21-09-2020  |
| Bob Bobbing        |  d3         |  23-11-2020  |
| Bob Bobbing        |  d3         |  21-09-2010  |
| etc... -----------------------------------------|

或者类似的东西,获取列名:

|----------------------------------------------------------------|
| NAME               |  DateType   |   column     |    date      |
|-------------------------------------------------|--------------|
| Joe Bloggs         |  d1         |   date1      |  21-09-2020  |
| Bob Bobbing        |  d2         |   date2      |  23-11-2020  |
| Bob Bobbing        |  d3         |   date3      |  21-09-2010  |
| etc... --------------------------------------------------------|

【问题讨论】:

    标签: mysql sql sql-order-by union unpivot


    【解决方案1】:

    您希望将列取消透视到行,同时过滤掉所有-0 日期。在 MySQL 中,最好的选择可能是union all

    select name, datetype, 'date1' which_col, date1 as date from mytable where date1 > '0000-00-00'
    union all select name, datetype, 'date2', date2 from mytable where date2 > '0000-00-00'
    union all select name, datetype, 'date', date3 from mytable where date3 > '0000-00-00'
    order by name, datetype, date
    

    【讨论】:

    • 与零日期比较可能会产生奇怪的结果...最好与低于数据逻辑上最不正确但在列数据类型允许的值范围内的某些合法日期值进行比较。
    • 如何获取列名? (我已经编辑了问题)
    • @SandeepKumar:您可以在每个union 成员中添加一个具有固定值的列。我编辑了我的答案。
    猜你喜欢
    • 1970-01-01
    • 2016-08-08
    • 2018-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-25
    • 2020-12-22
    • 1970-01-01
    相关资源
    最近更新 更多