【问题标题】:SQL ORDER BY date problemSQL ORDER BY 日期问题
【发布时间】:2010-12-05 11:27:17
【问题描述】:

你能帮我解决这个问题吗?我正在尝试按日期对 SQL 查询的结果进行排序,但没有得到我需要的结果。

我使用的查询是:

SELECT date FROM tbemp ORDER BY date ASC

结果是:

01/02/2009
03/01/2009
04/06/2009
05/03/2009
06/12/2008
07/02/2009

结果应该是:

06/12/2008
03/01/2009
01/02/2009
07/02/2009

我需要选择上述格式的日期。

非常感谢您的帮助。

【问题讨论】:

  • 当您发布问题以提供详细信息时很重要,例如您使用的数据库以及表中 DATE 列的数据类型。它使试图帮助您的人更容易;他们不必猜测。
  • 虽然我知道这对您的回答并不重要,但我很想听听为什么该列不是日期时间的好理由......
  • ORDER BY id(自动递增值)

标签: sql date sql-order-by


【解决方案1】:

您的日期列似乎不是 datetime 类型,而是 varchar。排序时必须将其转换为日期时间:

select date
from tbemp
order by convert(datetime, date, 103) ASC

style 103 = dd/MM/yyyy (msdn)

【讨论】:

  • 如果当前的语言和日期格式设置导致将 aa/bb/cccc 解释为月/日/年,这将无法正确排序,就像大多数美国安装的 SQL Server 的情况一样。 (我假设使用 CONVERT 这是 T-SQL,因此您可以将样式 103 指定为 CONVERT 的可选第三个参数并覆盖任何语言或日期格式上下文。)
  • 我很想知道如何从提供的信息中找出这些日期不是datetime 而是varchar。为什么仅仅通过更改字段类型,结果应该比最初显示的要少?是否应该有一个WHERE 子句来减少返回的答案,如果它给出所有结果,什么时候应该只给出其中一些?
【解决方案2】:

在我看来,您的列不是日期列,而是文本列(varchar/nvarchar 等)。您应该将其作为日期而不是字符串存储在数据库中。

如果您出于某种原因将其存储为字符串,请将其存储为可排序的格式,例如年年/月/日。

正如 najmeddine 所示,您可以在每次访问时转换列,但我会尽量不这样做。这将使数据库做更多的工作很多 - 它将无法保留适当的索引等。只要有可能,将数据存储在适合数据本身的类型中。

【讨论】:

  • @dusoft:使用什么分隔符并不重要,只要它的重要性顺序正确。
  • @Jon:比较两个连字符比比较两个斜线更容易,因为您不必处理角度。 :-D
【解决方案3】:

不确定您使用的是什么 dbms,但我会在 Microsoft SQL 中这样做:

select      [date]
from        tbemp 
order by    cast([date] as datetime) asc

【讨论】:

    【解决方案4】:

    这对我有用:

    SELECT datefield FROM myTable ORDER BY CONVERT(DATE, datefield) ASC

    【讨论】:

      【解决方案5】:

      以下答案可能对您有所帮助

      按日期标识符执行日期排序,但在 select 子句中使用 to_char() 函数并在 select 子句中使用其他标识符作为日期

      例如

      SELECT TO_CHAR(DISPDATE1,'DD/MM/YYYY') AS DISPDATE,
      SUM(APPLCOUNT) AS APPLIED,
      SUM(CONFCOUNT) AS CONFIRMED
      FROM
          (
              SELECT COUNT(ID) AS APPLCOUNT,
                         0 AS CONFCOUNT,
                         STUDENT.APPLIED_ON AS DISPDATE1
                  FROM STUDENT
                  WHERE STUDENT.ID = P_ID
                  GROUP BY STUDENT.APPLIED_ON
              UNION
                  SELECT 0 AS APPLCOUNT,
                         COUNT(ID) AS CONFCOUNT,
                         STUDENT.CONFIRMED_ON AS DISPDATE1
                  FROM STUDENT
                  WHERE STUDENT.ID = P_ID
                  GROUP BY STUDENT.CONFIRMED_ON
          )
      GROUP BY DISPDATE1
      ORDER BY DISPDATE1;
      

      【讨论】:

      • to_char 和其他 to_date(created_at, 'dd/mm/yyyy hh24:mi:ss') 作为 DISPDATE .. 感谢 Brushan!工作正常。
      【解决方案6】:

      SELECT CONVERT(char(19), CAST(date AS datetime), 101) as [date]
      来自 tbemp ORDER BY convert(datetime, date, 101) ASC

      【讨论】:

        【解决方案7】:

        尝试为我使用这项工作

        select *  from `table_name` ORDER BY STR_TO_DATE(start_date,"%d-%m-%Y") ASC
        

        其中 start_date 是字段名称

        【讨论】:

          【解决方案8】:

          我想按后代的时间顺序编辑几个事件,我刚刚做了一个:

          select 
          TO_CHAR(startdate,'YYYYMMDD') dateorder,
          TO_CHAR(startdate,'DD/MM/YYYY') startdate,
          ...
          from ...
          ...
          order by dateorder desc
          

          它对我有用。 但肯定不会适用于所有情况...... 只是希望它会帮助别人!

          【讨论】:

            【解决方案9】:

            这可能对你在 mysql、php 中有所帮助。

            //your date in any format
            $date = $this->input->post('txtCouponExpiry');
            
            $day = (int)substr($date, 3, 2);
            $month = (int)substr($date, 0, 2);
            $year = (int)substr($date, 7, 4);
            
            $unixTimestamp = mktime(0, 0, 0, $year, $day, $month);
            
            // insert it into database
            'date'->$unixTimestamp;
            
            //query for selecting  order by date ASC or DESC
            select * from table order_by date asc;
            

            【讨论】:

              【解决方案10】:

              试试这个

              Order by Convert(datetime,@date) desc
              

              【讨论】:

                【解决方案11】:

                这应该适用于您的日期格式

                order by convert(date, your_column, 104) desc

                【讨论】:

                  【解决方案12】:

                  强制转换/转换可能会导致超出范围的异常,不幸的是,这些异常并不总是像排除空值那么简单。

                  一种避免强制转换的简单替代方法是:

                  SELECT date
                  FROM table
                  ORDER BY YEAR(date), MONTH(date), DAY(date) ASC;
                  

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2021-12-23
                    • 2023-02-21
                    • 2013-12-07
                    • 1970-01-01
                    • 2011-08-18
                    • 1970-01-01
                    • 1970-01-01
                    • 2019-10-19
                    相关资源
                    最近更新 更多