2010-10-20 312 views
28

不確定該從哪裏開始。任何人都可以幫助/指向正確的方向。MySQL時間戳選擇日期範圍

我在MySQL時間戳列,我想選擇例如日期範圍,這是在2010年十月

感謝所有時間戳。

+1

對不起,上面沒有提到,它是一個unix時間戳,不是mysql時間戳。 – DRKM 2010-10-20 10:31:15

+0

我看到這篇文章,我的時間戳工作正常,我現在面臨的問題,如果調用它與一個連接它總是帶回零行返回...我的查詢是這樣的SELECT * FROM db.t1,db.t2 WHERE t2 .t1_id = t1.id AND timestamp> ='2014-06-21'AND timestamp <='2014-07-20'; – 2014-10-10 08:00:46

回答

35

通常它會是這樣:

SELECT * 
    FROM yourtable 
WHERE yourtimetimefield>='2010-10-01' 
    AND yourtimetimefield< '2010-11-01' 

但是因爲你有一個UNIX時間戳,你需要這樣的事:

SELECT * 
    FROM yourtable 
WHERE yourtimetimefield>=unix_timestamp('2010-10-01') 
    AND yourtimetimefield< unix_timestamp('2010-11-01') 
+0

謝謝! (另外5個字符) – DRKM 2010-10-20 10:47:54

+1

@merlinbeard這對於索引來說實際上是完全正常的,計算值是靜態的,可以直接與'yourtimefield'值進行比較。現在,如果您有'WHERE FROM_UNIXTIME(yourtimefield)> ='2010-10-01''這將不允許建立索引,因爲需要爲每一行計算與日期格式比較的值。話雖如此。對於大多數使用情況,我仍然會建議使用日期,日期時間,時間戳記字段類型而不是unix時間戳記。 – 2016-01-07 19:08:20

+0

@MikeBrant:正確的觀察。這個表達式被計算一次並被摺疊成一個常量,並且仍然可以與'yourtimefield'上的索引匹配。 merlinbeard的評論之後,我立即收到了一些預言,表明人們經常在沒有完全理解他們投票的情況下投票。嘿,聽起來像政治:) – 2016-01-08 16:05:54

5
SELECT * FROM table WHERE col >= '2010-10-01' AND col <= '2010-10-31' 
+0

對不起,我應該提到它是一個unix時間戳,而不是一個mysql時間戳(重要的信息位錯過!) – DRKM 2010-10-20 10:30:53

+0

我看到這篇文章,我的時間戳工作正常,我現在面臨的問題,如果調用它與一個連接它總是帶回返回零行 – 2014-10-06 09:13:03

+0

那麼會發生什麼記錄,具有時間戳2010-10-31 09: 00:00'? – 2016-01-11 01:33:40

34

緊湊,靈活的方法對時間戳沒有小數秒將是:

SELECT * FROM table_name 
WHERE field_name 
BETWEEN UNIX_TIMESTAMP('2010-10-01') AND UNIX_TIMESTAMP('2010-10-31 23:59:59') 

如果您使用的是小數秒和最新版本的MySQL,那麼您最好採用按照Wouter's answer使用>=<運營商的方法。

這裏是具有分數第二精度(最大精度在使用中)定義的時間的字段的一個示例:

mysql> create table time_info (t_time time(6), t_datetime datetime(6), t_timestamp timestamp(6), t_short timestamp null); 
Query OK, 0 rows affected (0.02 sec) 

mysql> insert into time_info set t_time = curtime(6), t_datetime = now(6), t_short = t_datetime; 
Query OK, 1 row affected (0.01 sec) 

mysql> select * from time_info; 
+-----------------+----------------------------+----------------------------+---------------------+ 
| 22:05:34.378453 | 2016-01-11 22:05:34.378453 | 2016-01-11 22:05:34.378453 | 2016-01-11 22:05:34 | 
+-----------------+----------------------------+----------------------------+---------------------+ 
1 row in set (0.00 sec) 
+0

+1,用於避免爲每次比較轉換列。人們會希望這非常有效! – 2010-10-20 10:45:48

+0

@Jimbo:不,「BETWEEN」在這裏並不是一個好的選擇,因爲它在兩端都是非包含的。 你必須寫'2010-10-01 00:00:00'和'2010-10-31 23:59:59'之間的東西才能得到正確的答案,並且希望不要使用毫秒。 此外,9月31日不存在,因爲9月只有30天。如果意思是「30」,那麼它是不正確的,因爲來自九月的數據將被返回。實際上,MySQL將這個解釋爲十月一日(非常整潔),這在這裏是正確的。我不確定爲什麼你會在9月31日寫它。 – 2016-01-08 16:01:47

+0

@WoutervanNifterick不確定到底發生了什麼,但已修復。我已經添加了一個關於fsp的評論,因爲這是在他們有效之前寫的 – Cez 2016-01-08 19:35:02

3

只要有可能,應避免在where子句中施加功能柱:

SELECT * 
    FROM table_name 
WHERE timestamp >= UNIX_TIMESTAMP('2010-10-01 00:00:00') 
    AND timestamp < UNIX_TIMESTAMP('2010-11-01 00:00:00'); 

在timestamp列中應用函數(例如,FROM_UNIXTIME(timestamp)= ...)會使索引變得更加困難。

3

此SQL查詢將爲您提取數據。它很容易和快速。

SELECT * 
    FROM table_name 
    WHERE extract(YEAR_MONTH from timestamp)="201010"; 
3

我可以看到有人對這個問題給出了很多評論。但我認爲,簡單使用LIKE可能更容易從表中獲取數據。

SELECT * FROM table WHERE COLUMN LIKE '2013-05-11%' 

使用LIKE和發佈數據通配符搜索。希望這會解決你的問題。

+0

編輯內容? – abhijitcaps 2016-12-07 02:14:02

0

如果你有一個MySQL時間戳,像2013-09-29 22:27:10你可以做到這一點

select * from table WHERE MONTH(FROM_UNIXTIME(UNIX_TIMESTAMP(time)))=9; 

轉換爲UNIX,然後使用UNIX時間函數來提取月份,在這種情況下,9九月份。