获取日期以正确排序的问题

时间:2018-01-03 22:22:15

标签: php sql-server codeigniter

我制作了一个程序并注意到2018年排序不正确。我修复它所以它会首先显示2018但它仍然有一个问题正确排序现在它显示示例1/02/2018然后1/03/218等等,但我需要它显示1/03/2018然后1 / 2/20188然后2017年全部。这是我的模型的部分代码,如果需要更多代码我将添加它。

Model.php

<?php
    defined('BASEPATH') OR exit('No direct script access allowed');

    class visitor_log_model extends CI_Model {

        var $table = 'visitor_log_list';
        var $column = array('date','name','vendor','department','contact_person','expected_arrival_time'); //set column field database for order and search
        var $order = array('id' => 'desc'); // default order 

        public function __construct()
        {
            parent::__construct();
            $this->load->database();
        }
    //gets the gets all the records from the database

        private function _get_datatables_query()
        {

            $this->db->from($this->table);
            $this->db->order_by("date", "asc");
            $this->db->order_by("expected_arrival_time", "asc");


            $i = 0;

            foreach ($this->column as $item) // loop column 
            {
                if($_POST['search']['value']) // if datatable send POST for search
                {

                    if($i===0) // first loop
                    {
                        $this->db->group_start(); // open bracket. query Where with OR clause better with bracket. because maybe can combine with other WHERE with AND. 
                        $this->db->like($item, $_POST['search']['value']);
                    }
                    else
                    {
                        $this->db->or_like($item, $_POST['search']['value']);
                    }

                    if(count($this->column) - 1 == $i) //last loop
                        $this->db->group_end(); //close bracket
                }
                $column[$i] = $item; // set column array variable to order processing
                $i++;
            }

1 个答案:

答案 0 :(得分:3)

将日期存储为字符串是一个非常糟糕的主意!笨拙,缓慢和错误...

对于SQL Server的引擎,字符串是一个字符串。您可以将列命名为date,并且可以存储看起来像日期的值,但是可以根据字母数字排序的规则对其进行排序(如在词典中)。

此外:像1/02/2018这样的日期格式取决于文化。有些系统会将其作为2月的第一个,其他系统将作为1月的第二个。这可能对您完全有效并通过所有内部测试,但会在客户的机器上发生故障。

  1. 使用适当的类型存储任何值!将DATETIME2DATE与现代SQL-Server一起使用!
  2. 如果你必须使用字符串格式(比如序列化),你应该坚持使用安全格式!最好是ISO8601,在大多数情况下YYYY-MM-ddTHH:mm:ss(提防中间的T。)
  3. 仅在您的表示层中考虑日期格式(其可视化表示)!