Trong bài này mình sẽ hướng dẫn cách sử dụng hàm STR_TO_DATE
trong MySQL
thông qua cú pháp và ví dụ thực tế.
Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.
1. Mô tả
Hàm STR_TO_DATE
lấy một chuỗi
và trả về một ngày được chỉ định bởi mặt nạ định dạng.
2. Cú pháp
Cú pháp của hàm STR_TO_DATE
trong MySQL
là:
STR_TO_DATE[ string, format_mask ]
Trong đó:
Bài viết này được đăng tại [free tuts .net]
string
: Giá trị chuỗi để định dạng là một ngày.format_mask
: Các định dạng để áp dụng cho string. Sau đây là danh sách các tùy chọn cho tham số format_mask. Các tham số này có thể được sử dụng trong nhiều kết hợp
Giá trị | Mô tả |
%a | Viết tắt tên ngày trong tuần [Sun - Sat] |
%b | Viết tắt tên tháng [Jan đến Dec] |
%c | Tháng dưới dạng giá trị số [0 đến 12] |
%D | Ngày trong tháng dưới dạng giá trị số, theo sau là hậu tố [1st, 2nd, 3rd, ...] |
%d | Ngày trong tháng dưới dạng giá trị số [01 đến 31] |
%e | Ngày trong tháng dưới dạng giá trị số [1 đến 31] |
%f | Giây [000000 đến 999999] |
%H | Hour [00 đến 23] |
%h hoặc %l | Giờ [00 đến 12] |
%i | Phút [00 đến 59] |
%j | Ngày trong năm [001 đến 366] |
%k | Giờ [00 đến 23] |
%l | Giờ [1 đến 12] |
%M | Tên tháng đầy đủ [January đến December] |
%m | Tên tháng dưới dạng giá trị số [00 đến 12] |
%p | AM hoặc PM |
%r | Thời gian ở định dạng 12 giờ AM hoặc PM [hh: mm: ss AM / PM] |
%S | Giây [00 đến 59] |
%s | Giây [00 đến 59] |
%T | Thời gian ở định dạng 24 giờ [hh: mm: ss] |
%U | Tuần mà Chủ nhật là ngày đầu tuần [00 đến 53] |
%u | Tuần mà thứ Hai là ngày đầu tuần [00 đến 53] |
%V | Tuần mà Chủ nhật là ngày đầu tuần [01 đến 53] |
%v | Tuần mà thứ Hai là ngày đầu tuần [01 đến 53] |
%W | Tên ngày trong tuần đầy đủ [Sunday đến Saturday] |
%w | Ngày trong tuần trong đó Chủ nhật = 0 và Thứ bảy = 6 |
%X | Năm trong tuần mà Chủ nhật là ngày đầu tuần |
%x | Năm trong tuần, thứ Hai là ngày đầu tuần |
%Y | Năm dưới dạng giá trị số, 4 chữ số |
%y | Năm dưới dạng giá trị số, 2 chữ số |
Lưu ý:
- Hàm
STR_TO_DATE
sẽ trả về giá trị ngày giờ, nếu chuỗi chứa cả phần ngày và thời gian hợp lệ. - Hàm
STR_TO_DATE
sẽ trả về giá trị ngày, nếu chuỗi chỉ chứa các phần ngày hợp lệ. - Hàm
STR_TO_DATE
sẽ trả về giờ, nếu chuỗi chỉ chứa các phần giờ hợp lệ. - Hàm
STR_TO_DATE
sẽ trả về giá trị NULL, nếu nó không thể trích xuất các phần ngày và giờ hợp lệ bằng cách sử dụng format_mask.
3. Version
Hàm STR_TO_DATE
có thể được sử
dụng trong các phiên bản sau của MySQL
:
- MySQL 5.7, MySQL 5.6, MySQL 5.5, MySQL 5.1, MySQL 5.0, MySQL 4.1, MySQL 4.0, MySQL 3.23
4. Ví dụ
mysql> SELECT STR_TO_DATE['February 05 2019', '%M %d %Y']; Ket qua: '2019-02-05' mysql> SELECT STR_TO_DATE['March,9,2019', '%M,%e,%Y']; Ket qua: '2019-03-09' mysql> SELECT STR_TO_DATE['Friday, February 20, 2019', '%W, %M %e, %Y']; Ket qua: '2019-02-20' mysql> SELECT STR_TO_DATE['2019,5,25 08', '%Y,%m,%d %h']; Ket qua: '2019-05-25 08:00:00' mysql> SELECT STR_TO_DATE['2019,3,27 02,30,05', '%Y,%m,%d %h,%i,%s']; Ket qua: '2019-03-27 02:30:05' mysql> SELECT STR_TO_DATE['11,10,35', '%h,%i,%s']; Ket qua: 'NULL'
Tôi đang sử dụng jQuery datepicker, định dạng của datepicker là cái này 08/25/2012
tôi gặp lỗi khi chèn vào cơ sở dữ liệu của mình, nó chỉ chèn 0000-00-00 00 00 00
mã của tôi là
Tôi chắc chắn rằng phụ trang của tôi là chính xác ...
- php
- mysql
- date
- insert
59 hữu ích 1 bình luận 348k xem chia sẻ
answer
178
Như đã nêu trong Chữ viết ngày và giờ :
MySQL nhận ra
DATE
các giá trị trong các định dạng sau:
Dưới dạng một chuỗi ở một trong hai
'YYYY-MM-DD'
hoặc'YY-MM-DD'
định dạng. Cho phép cú pháp "thoải mái": Bất kỳ ký tự dấu câu nào cũng có thể được sử dụng làm dấu phân cách giữa các phần ngày tháng. Ví dụ,'2012-12-31'
,'2012/12/31'
,'2012^12^31'
, và'2012@12@31'
là tương đương.Là một chuỗi không có dấu phân cách ở một trong hai
'YYYYMMDD'
hoặc'YYMMDD'
định dạng, với điều kiện là chuỗi có ý nghĩa như một ngày tháng. Ví dụ,'20070523'
và'070523'
được hiểu là'2007-05-23'
, nhưng'071332'
là bất hợp pháp [nó có các phần tháng và ngày vô nghĩa] và trở thành'0000-00-00'
.Là một số ở một trong hai
YYYYMMDD
hoặcYYMMDD
định dạng, miễn là số đó có ý nghĩa như một ngày tháng. Ví dụ,19830905
và830905
được hiểu là'1983-09-05'
.
Do đó, chuỗi '08/25/2012'
không phải là một ký tự ngày MySQL hợp lệ. Bạn có bốn tùy chọn [theo một
số thứ tự tùy chọn mơ hồ, không có bất kỳ thông tin nào khác về yêu cầu của bạn]:
Định cấu hình Datepicker để cung cấp ngày ở định dạng được hỗ trợ bằng cách sử dụng
altField
cùng vớialtFormat
tùy chọn của nó :$[ "selector" ].datepicker[{ altField : "#actualDate" altFormat: "yyyy-mm-dd" }];
Hoặc, nếu bạn hài lòng khi người dùng thấy ngày ở
YYYY-MM-DD
định dạng, chỉ cần đặtdateFormat
tùy chọn thay thế:$[ "selector" ].datepicker[{ dateFormat: "yyyy-mm-dd" }];
Sử dụng
STR_TO_DATE[]
hàm của MySQL để chuyển đổi chuỗi:INSERT INTO user_date VALUES ['', '$name', STR_TO_DATE['$date', '%m/%d/%Y']]
Chuyển đổi chuỗi nhận được từ jQuery thành một thứ mà PHP hiểu là ngày tháng, chẳng hạn như
DateTime
đối tượng:$dt = \DateTime::createFromFormat['m/d/Y', $_POST['date']];
và sau đó:
lấy một chuỗi có định dạng phù hợp:
$date = $dt->format['Y-m-d'];
lấy dấu thời gian UNIX:
$timestamp = $dt->getTimestamp[];
sau đó được chuyển trực tiếp đến
FROM_UNIXTIME[]
hàm của MySQL :INSERT INTO user_date VALUES ['', '$name', FROM_UNIXTIME[$timestamp]]
Thao tác thủ công chuỗi thành một ký tự hợp lệ:
$parts = explode['/', $_POST['date']]; $date = "$parts[2]-$parts[0]-$parts[1]";
Cảnh báo
Mã của bạn dễ bị chèn SQL. Bạn thực sự nên sử dụng các câu lệnh đã chuẩn bị sẵn , trong đó bạn chuyển các biến của mình dưới dạng các tham số không được đánh giá cho SQL. Nếu bạn không biết tôi đang nói về điều gì, hoặc làm thế nào để sửa chữa nó, hãy đọc câu chuyện về Bobby Tables .
Ngoài ra, như đã nêu trong phần giới thiệu chương hướng dẫn sử dụng PHP về các
mysql_*
hàm:Tiện ích mở rộng này không được dùng nữa kể từ PHP 5.5.0 và không được khuyến nghị để viết mã mới vì nó sẽ bị xóa trong tương lai. Thay vào đó, nên sử dụng phần mở rộng mysqli hoặc PDO_MySQL . Xem thêm Tổng quan về API MySQL để được trợ giúp thêm khi chọn API MySQL.
Có vẻ như bạn đang sử dụng một
DATETIME
hoặcTIMESTAMP
cột để giữ giá trị ngày tháng; Tôi khuyên bạn nên xem xét sử dụng loại MySQLDATE
thay thế. Như đã giải thích trong CácDATE
,DATETIME
vàTIMESTAMP
loại :Các
DATE
loại được sử dụng cho các giá trị với một phần ngày nhưng không có bán thời gian. MySQL truy xuất và hiển thị các giá trị DATE theo'YYYY-MM-DD'
định dạng. Phạm vi được hỗ trợ là'1000-01-01'
để'9999-12-31'
.Các
DATETIME
loại được sử dụng cho các giá trị có chứa cả ngày và các bộ phận thời gian. MySQL truy xuất và hiển thịDATETIME
các giá trị theo'YYYY-MM-DD HH:MM:SS'
định dạng. Phạm vi được hỗ trợ là'1000-01-01 00:00:00'
để'9999-12-31 23:59:59'
.Kiểu
TIMESTAMP
dữ liệu được sử dụng cho các giá trị chứa cả phần ngày và giờ.TIMESTAMP
có một loạt các'1970-01-01 00:00:01'
UTC đến'2038-01-19 03:14:07'
UTC.
178 hữu ích 0 bình luận chia sẻ
answer
10
Bạn nên cân nhắc tạo dấu thời gian từ ngày đó với mktime []
ví dụ:
$date = explode['/', $_POST['date']];
$time = mktime[0,0,0,$date[0],$date[1],$date[2]];
$mysqldate = date[ 'Y-m-d H:i:s', $time ];
10 hữu ích 0 bình luận chia sẻ
answer
8
$date_field = date['Y-m-d',strtotime[$_POST['date_field']]];
$sql = mysql_query["INSERT INTO user_date [column_name,column_name,column_name] VALUES['',$name,$date_field]"] or die [mysql_error[]];
8 hữu ích 2 bình luận chia sẻ
answer
1
Bạn phải đảm bảo rằng định dạng ngày là YYYY-MM-DD trên đầu ra jQuery của bạn. Tôi có thể thấy jQuery trả về MM-DD-YYYY, đây không phải là định dạng ngày MySQL hợp lệ và đây là lý do tại sao nó trả về lỗi.
Để chuyển đổi nó thành đúng, bạn có thể làm như sau:
$dateFormated = split['/', $date];
$date = $dateFormated[2].'-'.$dateFormated[0].'-'.$dateFormated[1];
Sau đó, bạn sẽ nhận được ngày được định dạng sẽ là định dạng MySQL hợp lệ, đó là YYYY-MM-DD, tức là 2012-08-25
Tôi cũng khuyên bạn nên sử dụng mysql_real_escape_string khi bạn chèn dữ liệu vào cơ sở dữ liệu để ngăn chặn việc tiêm SQL như một giải pháp nhanh chóng hoặc tốt hơn là sử dụng PDO hoặc MySQLi .
Truy vấn chèn của bạn bằng cách sử dụng mysql_real_escape_string
sẽ giống như sau:
$sql = mysql_query[ "INSERT INTO user_date VALUE[ '', '" .mysql_real_escape_string[$name]. "', '" .mysql_real_escape_string[$date]. "'" ] or die [ mysql_error[] ];
1 hữu ích 0 bình luận chia sẻ
answer
0
Phương pháp đơn giản nhất là
$dateArray = explode['/', $_POST['date']];
$date = $dateArray[2].'-'.$dateArray[0].'-'.$dateArray[1];
$sql = mysql_query["INSERT INTO user_date [column,column,column] VALUES['',$name,$date]"] or die [mysql_error[]];
0 hữu ích 0 bình luận chia sẻ
answer
0
Lấy một đối tượng ngày tháng từ bộ chọn ngày jquery bằng cách sử dụng
var myDate = $['element'].datepicker['getDate']
Đối với mysql, ngày cần phải ở định dạng thích hợp. Một tùy chọn xử lý mọi vấn đề về múi giờ là sử dụng moment.js
moment[myDate].format['YYYY-MM-DD HH:mm:ss']
0 hữu ích 0 bình luận chia sẻ
answer
0
HTML:
Date
Chủ Đề