【问题标题】:Order SELECT Statement from joined tables by variable按变量从连接表中排序 SELECT 语句
【发布时间】:2016-02-01 21:09:28
【问题描述】:

我正在尝试通过从数据库中的日期计算创建的变量对我的查询结果进行排序..

我的数据库中有一行名为“DateInStock”,它是一个 VARCHAR,并像这样从 csv 文件输入 - 2015 年 9 月 9 日

$result = mysql_query("SELECT * FROM csv INNER JOIN kbb ON csv.VIN=kbb.Vin ORDER BY $numberDays DESC");
while($row = mysql_fetch_array( $result )) {

// Calculate Days in Stock
$todaydate = date("m/d/Y");
$dis = $row['DateInStock'];
$startTimeStamp = strtotime($todaydate);
$endTimeStamp = strtotime($dis);
$timeDiff = abs($endTimeStamp - $startTimeStamp);
$numberDays = $timeDiff/86400;  // 86400 seconds in one day
$numberDays = intval($numberDays);

echo $numberDays;
}

所以 $numberDays 给了我它的存货天数..

echo $numberdays; // Gives me 40, 38, 30 etc.. for each iteration 

我想按 $numberDays DESC 或 ASC 对查询结果进行排序

【问题讨论】:

  • 你说的不正常是什么意思?另外,您能否展示一下您的输出是什么,以及您期望的输出是什么?
  • DateInStock 是 DATE 数据类型还是其他数据类型?
  • DateInStock 是从 csv 文件输入到数据库的。它在输入时已经像这样格式化了。 @David 我似乎找不到一个订单,这就是我所说的不正常的意思。它改变了订单,但似乎找不到模式。我希望它从最新到最旧的 dateInStock 输出
  • 尝试将 csv.DateInStock 显式转换为 order by 中的日期。感觉 mySQL 将其视为日期以外的东西
  • 很有可能。与其将其作为数据排序,不如将其作为字符串排序,这取决于您的日期格式可能非常不正常: order by STR_TO_DATE(csv.DateInStock, '%d/%m/%Y') desc

标签: php sql datetime


【解决方案1】:

为您的“DateInStock”列使用日期/时间戳数据类型会更有效。但您可以即时将其转换为日期数据类型:

create table aaa(dt varchar(30));

insert into aaa values
('2015-12-01'),('2016-01-01'),('2016-01-10'),('2016-01-20');

SQL:

select datediff(cast(dt as date), now()) as diff from aaa;

输出:

diff
-62
-31
-22
-12

这里是SQLFiddle

【讨论】:

    【解决方案2】:

    好的,感谢@LordBaconPants,它做到了 -

    $result = mysql_query("SELECT * FROM csv INNER JOIN kbb ON csv.VIN=kbb.Vin ORDER BY STR_TO_DATE(DateInStock, '%m/%d/%Y') DESC ");
    

    这解决了数据库中日期的问题,但仍然需要知道如何使用计算变量对查询进行排序,所以我可能会回来......谢谢大家!

    【讨论】:

      猜你喜欢
      • 2011-09-09
      • 1970-01-01
      • 1970-01-01
      • 2011-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-02
      • 2011-03-29
      相关资源
      最近更新 更多