Chuyển đổi dấu thời gian thành ngày trong truy vấn MySQL


187

Tôi muốn chuyển đổi một timestamptrong MySQL thành một ngày.

Tôi muốn định dạng trường user.registration vào tệp văn bản dưới dạng a yyyy-mm-dd.

Đây là SQL của tôi:

$sql = requestSQL("SELECT user.email, 
                   info.name, 
                   FROM_UNIXTIME(user.registration),
                   info.news
                   FROM user, info 
                   WHERE user.id = info.id ", "export members");

Tôi cũng đã thử chuyển đổi ngày với:

DATE_FORMAT(user.registration, '%d/%m/%Y')
DATE(user.registration)

Tôi lặp lại kết quả trước đó để viết tệp văn bản và tôi nhận được:

email1; name1; DATE_FORMAT (user.registration, '% d /% m /% Y'); news1

email2; name2; news2

Làm cách nào để chuyển đổi trường đó thành ngày?


Nó lưu tập tin chính xác như thế? Mã bạn đang sử dụng để chạy truy vấn sql là gì?
seanbreeden

1
Tôi đã chỉnh sửa câu hỏi của mình, certeteQuery đang chạy truy vấn
remyremy

Câu trả lời:


371
DATE_FORMAT(FROM_UNIXTIME(`user.registration`), '%e %b %Y') AS 'date_formatted'

2
Kể từ MySQL 5.6.23, tôi thấy rằng giá trị của FROM_UNIXTIME () phải được nhập trực tiếp: ví dụ: DATE_FORMAT (FROM_UNIXTIME (user.registration), '% e% b% Y') AS 'date_formatted'
JESii

CHỌN * TỪ người dùng WHERE DATE_FORMAT (FROM_UNIXTIME ( users. user_created_at), '% Y-% b-% e') = '2015-03-06' đây có phải là định dạng chính xác hay tôi nên sửa đổi điều này?
Dheeraj Thedijje

2
@DheerajThedijje điều này hiển thị là 2018-ngày 6 tháng 11. Bạn có thể đang tìm kiếm '%Y-%m-%d'khi bạn định dạng nó trong PHP (date('Y-m-d',$row->user_created_at))- điều này (cả hai biến thể, SQL và PHP) hiển thị là 2018-11-06
Chris S.

Trong trường hợp bạn muốn thêm thời gian theo kiểu "hh: mm: ss" này, hãy thêm chuỗi này vào chuỗi định dạng '% H:% i:% s'
luis.ap.uyen

63

Chuyển đổi dấu thời gian thành ngày trong MYSQL

Tạo bảng có dấu thời gian nguyên:

mysql> create table foo(id INT, mytimestamp INT(11));
Query OK, 0 rows affected (0.02 sec)

Chèn một số giá trị

mysql> insert into foo values(1, 1381262848);
Query OK, 1 row affected (0.01 sec)

Hãy xem

mysql> select * from foo;
+------+-------------+
| id   | mytimestamp |
+------+-------------+
|    1 |  1381262848 |
+------+-------------+
1 row in set (0.00 sec)

Chuyển đổi số thành dấu thời gian:

mysql> select id, from_unixtime(mytimestamp) from foo;
+------+----------------------------+
| id   | from_unixtime(mytimestamp) |
+------+----------------------------+
|    1 | 2013-10-08 16:07:28        |
+------+----------------------------+
1 row in set (0.00 sec)

Chuyển đổi nó thành một định dạng có thể đọc được:

mysql> select id, from_unixtime(mytimestamp, '%Y %D %M %H:%i:%s') from foo;
+------+-------------------------------------------------+
| id   | from_unixtime(mytimestamp, '%Y %D %M %H:%i:%s') |
+------+-------------------------------------------------+
|    1 | 2013 8th October 04:07:28                       |
+------+-------------------------------------------------+
1 row in set (0.00 sec)

vui lòng sửa% h thành% H
Tomot

61

Để chỉ nhận được một ngày, bạn có thể cast

cast(user.registration as date)

và để có được một định dạng cụ thể sử dụng date_format

date_format(registration, '%Y-%m-%d')

Bản thử nghiệm SQLFiddle


Nó cho kết quả tương tự, cast (user.registration as date) được hiển thị thay vì giá trị của trường
remyremy

5
Điều này hoạt động mặc dù - diễn viên (from_unixtime (user.registration) AS date)
Eric Ness

tôi có định dạng ngày cụ thể mà nó hoạt động với tôi cũng như có thể cảm ơn
saber tabatabaee yazdi

sử dụng "as DATETIME" để nhận số phút và giây nữa
Enrique

Tôi nghĩ rằng câu trả lời này là giải pháp ngắn gọn và rõ ràng. Tôi thích điều này.
La Mã Matveev

18

Nếu registrationtrường thực sự thuộc loại TIMESTAMPbạn có thể chỉ cần làm:

$sql = "SELECT user.email, 
           info.name, 
           DATE(user.registration), 
           info.news
      FROM user, 
           info 
     WHERE user.id = info.id ";

và đăng ký sẽ được hiển thị là yyyy-mm-dd


Tôi đã thử nhưng tôi nhận được kết quả tương tự: DATE (user.registration) được hiển thị thay vì giá trị của trường
remyremy

như ai đó đã đề xuất, bạn có thể chạy truy vấn thành công bằng cách sử dụng máy khách mysql trực tiếp không? Tôi chưa nghe nói về hàm consteteQuery, chính xác thì nó làm gì?
cs0lar

Thật không may, tôi không thể sử dụng máy khách mysql trực tiếp, tôi không có máy chủ của riêng mình ... Tôi đã cung cấp certeteQuery, về cơ bản, nó chỉ chạy truy vấn và kiểm tra nếu có lỗi để gửi email ...
remyremy

2
Trên thực tế, tôi nhận ra lĩnh vực của mình là loại BIGINT chứ không phải TIMESTAMP. Chỉ có nội dung là dấu thời gian (1328649722), vì vậy đó là lý do tại sao nó không hoạt động. Bây giờ mọi thứ đều tốt với FROM_UNIXTIME!
hồi hương

Công việc này tốt, tôi đã thử với datetime vì tôi chỉ cần lấy phần ngày.
ericsicons

10

Chỉ cần sử dụng chức năng DATE của mysql:

mysql> select DATE(mytimestamp) from foo;

5
SELECT DATE(UNIX_TIMESTAMP())nhổ NULLtrong MySQL 5.7,14 của tôi
Xenos

thử DATE (CURRENT_TIMESTAMP ())
Morey

7

Bạn nên chuyển đổi timestampsang date.

select FROM_UNIXTIME(user.registration, '%Y-%m-%d %H:%i:%s') AS 'date_formatted'

TỪ_UNIXTIME


2

Nếu bạn nhận được truy vấn trong đầu ra của mình, bạn cần cho chúng tôi xem mã thực sự lặp lại kết quả. Bạn có thể gửi mã mà gọi certeteQuery không?

Ví dụ: nếu bạn đã sử dụng dấu ngoặc đơn trong php, nó sẽ in tên biến chứ không phải giá trị

echo 'foo is $foo'; // foo is $foo

Điều này nghe có vẻ giống như vấn đề của bạn và tôi khẳng định đây là nguyên nhân.

Ngoài ra, hãy thử xóa biểu tượng @ để xem có giúp ích gì không bằng cách cung cấp cho bạn nhiều thông tin hơn.

vậy nên

$SQL_result = @mysql_query($SQL_requete); // run the query

trở thành

  $SQL_result = mysql_query($SQL_requete); // run the query

Điều này sẽ ngăn chặn mọi sự triệt tiêu lỗi nếu truy vấn đang đưa ra lỗi.


2

Tôi đã làm điều đó với chức năng 'ngày' như được mô tả ở đây :

(SELECT count(*) as the-counts,(date(timestamp)) as the-timestamps FROM `user_data` WHERE 1 group BY the-timestamps)

2

FROM_UNIXTIME(unix_timestamp, [format]) là tất cả những gì bạn cần

FROM_UNIXTIME(user.registration, '%Y-%m-%d') AS 'date_formatted'

FROM_UNIXTIMElấy một giá trị số và biến đổi nó thành một DATEđối tượng
hoặc nếu được cung cấp một chuỗi định dạng, nó sẽ trả về nó dưới dạng một chuỗi.

Giải pháp cũ hơn là lấy đối tượng ngày ban đầu và định dạng nó bằng hàm thứ hai DATE_FORMAT... nhưng điều này không còn cần thiết nữa


1

Thử:

SELECT strftime("%Y-%d-%m", col_name, 'unixepoch') AS col_name

Nó sẽ định dạng dấu thời gian tính bằng mili giây đến chuỗi yyyy-mm-dd.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.