Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Định dạng ngày và làm rõ Truy vấn SQL

Đó là rất nhiều câu hỏi cho một chủ đề .. nhưng tôi sẽ cố gắng giải quyết hầu hết chúng. (Câu hỏi đầu tiên bạn có thể tự trả lời, chỉ cần thử nó;-)

Theo như truy vấn, ngay cả khi nó chạy mà không có lỗi - nó có thể được cải thiện. Tôi sẽ không viết lại truy vấn cho bạn, nhưng đây là những vấn đề chính

  • Đầu tiên, không bao giờ sử dụng các giá trị máy khách thô trực tiếp trong SQL. Luôn sử dụng cfqueryparam để bảo vệ khỏi tiêm sql. Nó cũng có những lợi ích khác, nhưng lợi ích đó rất quan trọng trong một ứng dụng web.

  • Thứ hai, bạn đang chuyển vào chuỗi ngày . Chuỗi ngày không rõ ràng và có thể bị hiểu sai, tùy thuộc vào định dạng và công cụ thực hiện phân tích cú pháp. Tốt hơn nhiều là sử dụng ngày đối tượng thay vì. Một cách để làm điều đó là sử dụng cfqueryparam và một trong các loại ngày:cf_sql_date (chỉ ngày) hoặc cf_sql_timestamp (ngày và giờ).

  • Thứ ba, như tôi đã đề cập trên chuỗi khác của bạn , bạn thực sự cần đơn giản hóa truy vấn của mình! Nhiều truy vấn con vốn đã khó sử dụng .. việc thêm bộ lọc ngày vào từng truy vấn con khiến nó hoàn toàn không thể quản lý được. Tôi khuyên bạn nên xem xét các cách để đơn giản hóa nó. Đề xuất của Ed cung cấp một khả năng, bằng cách giảm nó thành một JOIN và một vài lệnh gọi hàm.

Thực ra đó chỉ là cách IDE của bạn hiển thị nó đối với con người. Nó không thực sự được lưu trữ theo cách đó. Trong nội bộ, ngày tháng được lưu trữ dưới dạng số lớn. Tuy nhiên, truy vấn của bạn cần tính đến thực tế là cột của bạn lưu trữ ngày thời gian.

Giả sử bạn muốn truy xuất tất cả các bản ghi ngày tháng vào tháng 6:

    form.startDate = "06/01/2013"
    form.endDate = "06/30/2013"

Về mặt khái niệm, bạn sẽ cần một biểu thức sql như sau:

    WHERE column BETWEEN '06/01/2013 at midnight' AND '06/30/2013 11:59:59 PM' 

Tuy nhiên, việc xây dựng các giá trị ngày / giờ đó là một chút klunky IMO. Một cách đơn giản hơn để xử lý nó là sử dụng mô hình này:

   WHERE column >= {startDateAtMidnight}        
   AND   column <  {dayAfterEndDateAtMidnight}

Bộ lọc truy vấn thực tế của bạn sẽ trông giống như sau:

    WHERE column >= <cfqueryparam value="#form.startDate#" 
                                  cfsqltype="cf_sql_date">
    AND   column <  <cfqueryparam value="#dateAdd('d', 1, form.endDate)#" 
                                  cfsqltype="cf_sql_date">

Bằng cách thêm một ngày vào form.endDate và sử dụng < so sánh, truy vấn kết quả là:

    WHERE column >= '2013-06-01 00:00:00'  
    AND   column < '2013-07-01 00:00:00'  

Điều này sẽ tạo ra kết quả chính xác giống như biểu thức GIỮA trước đó.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tiện ích mở rộng MySQL không dùng nữa trong PHP 5.5.x

  2. PDO tìm nạp một cột từ bảng thành mảng 1 chiều

  3. Phiên bản mysqldump Lỗi khi xuất dữ liệu từ MySQL

  4. Cần cập nhật cơ sở dữ liệu ứng dụng một người dùng của tôi để cho phép nhiều người dùng, làm cách nào để sửa đổi giản đồ cơ sở dữ liệu?

  5. SQL Division sử dụng 'không tồn tại' trong mysql