【问题标题】:Issue with getting date to sort correctly获取日期以正确排序的问题
【发布时间】:2018-01-03 22:22:14
【问题描述】:

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

模型.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++;
            }

【问题讨论】:

  • 那些“日期”列真的是日期类型吗?如果不是,他们应该是;你会免费得到这个。
  • 它是一个带有codeigniter的微软sql server
  • 我只是检查了它设置为 navchar 的数据库,因为我使用的是日期选择器,所以是否需要更改日期是否重要

标签: php sql-server codeigniter


【解决方案1】:

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

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

此外:像1/02/2018 这样的日期格式取决于文化。一些系统将在 2 月 1 日进行此操作,其他系统将在 1 月 2 日进行此操作。这可能非常适合您并通过所有内部测试,但会在客户的机器上因愚蠢的错误而中断。

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

【讨论】:

  • 所以我应该将其更改为日期唯一的问题是我使用的是日期选择器,它以某种方式放置日期
  • 是的!您应该将该值存储为日期类型!您的日期选择器将允许检索键入的值,或者您的语言将允许从字符串中解析 real 日期。您可以将列更改为DATETIME2DATE,但仍将数据作为字符串传输。但请使用安全格式! Read thisthis
  • 你说得对,我创建了一个新表并将列中的类型更改为 date 并将数据传输过来,现在可以正常工作了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-16
  • 2019-06-30
  • 1970-01-01
  • 2011-10-20
  • 2014-01-28
  • 1970-01-01
  • 2019-12-27
相关资源
最近更新 更多