2011-06-19 48 views
0

當每個項目都進入我用下面的方法插入日期分貝:按時間排序的正確方法是什麼?

date_default_timezone_set('America/New_York'); 
ob_start(); 
$createdon = date('l, F j, Y, h:i A'); 
ob_get_clean(); 

這個輸出是這樣的:

Tuesday, May 3, 2011, 04:50 PM 

這是查詢:

select test_id, why_test, date_time 
    from the_test 
    where p_id = '$id' 
    UNION 
    select pencil_id, pencil_name, date_time 
    from pencils 
    where p_id = '$id' 
    ORDER BY 3 DESC 

現在,當我按功能使用訂單時,它並沒有正確執行。日期仍在混淆。我使用了date_time DESC命令。

我使用php/phpmyadmin。

任何想法?

+0

什麼是你的表結構? 'SHOW CREATE TABLE tbl_name'並確保你將日期存儲爲TIMESTAMP或DATETIME字段 – JamesHalsall

+0

轉換隻會讓我失去所有日期。 – AAA

+0

這是因爲您已將日期作爲字符串以PHP不能理解的格式存儲。 PHP的標準日期/時間字符串格式是'YYYY-MM-DD HH:MM:SS'。由於'date_time'字段是一個字符串,因此PHP會將其內容作爲一個字符串進行排序,這意味着十二月將在2月份之前到達 –

回答

6

將日期存儲爲字符串是錯誤的。您應該將日期存儲爲日期。

MySQL有一系列與日期和時間相關的適當類型;我建議使用TIMESTAMPDATETIME(可能是後者;請在手冊中查看,看看最適合您的是什麼)。

爲避免丟失現有的數據,當您解決您的表結構:

  • 添加一個字段與正確的類型;
  • 更新表中的每一行以將數據複製到新字段,可能使用UNIX_TIMESTAMP函數—這是一次性副本,可能需要一些時間;
  • 刪除舊字段並開始使用新字段。

ORDER BY將在這個領域自然發揮作用,因爲您現在正在使用MySQL,因爲它被設計用於使用。

+1

'TIMESTAMP'考慮到當前時區,並且可以在連接時區不同的情況下自動轉換到服務器時區。 'DATETIME'不與時區保持關係。 – datasage

2

嘗試

SELECT .... ORDER BY UNIX_TIMESTAMP(`date_time`) DESC 

的想法在這裏,是將一個字符串轉換爲可排序的編號。如果你不熟悉unix時間戳,它是1970年1月1日以來的秒數,所以如果你可以把時間轉換成那個時間,你可以得到一個比較時間的線性簡單的方法。

但我相信MySQL的UNIX_TIMESTAMP()需要在格式的字符串:1970-01-01 00:00:00

但是,這個概念仍然存在,進入轉彎日期(或甚至將其存儲)作爲UNIX時間戳或MySQL的本地日期類型,如datetimetimestamp

+0

@hexa嗨,謝謝!這工作,但它默認只有ASC時,我嘗試DESC它不這樣做。 – AAA

+0

使用「日期」而不是「日期」返回到舊問題。 – AAA

+0

@hexa:多麼可怕的低效率的事情。 –

相關問題