我有一个问题,我按日期过滤集合,并且期望得到的项目没有返回到集合中,但是,如果我打印出集合使用的SQL并针对我的数据库运行该SQL,则会返回该项目。
$from = new \DateTime($lsDate);
$orders = $this->_orderCollectionFactory->create()
->addFieldToSelect(['grand_total', 'created_at'])
->addAttributeToFilter('created_at', array('gteq' => $from->format('Y-m-d H:i:s')))
->addAttributeToFilter('customer_id',$customer->getId())
->setPageSize(10)
->setOrder('created_at', 'desc');
$from->format('Y-m-d H:i:s') // Lets say this is 2019-08-06 15:33:00
$this->logger->info(count($orders)); // This is 0
Run Code Online (Sandbox Code Playgroud)
如果我打印出生成的SQL,它看起来像这样:
SELECT `main_table`.`entity_id`, `main_table`.`grand_total`, `main_table`.`created_at` FROM `sales_order` AS `main_table` WHERE (`created_at` >= '2019-08-06 15:33:21')
Run Code Online (Sandbox Code Playgroud)
created_at应退回的订单日期为2019-08-06 15:34:00。
如果我在数据库上运行上述查询,它将返回上面的一个顺序,但是正如您在我上面的代码中看到的那样,该集合为空。
如果我将订单日期更改为2019-08-06 16:34:21(未来一小时),则代码将返回包含一个项目的集合。看起来与时区有关吗?也许是DST(夏令时)?
编辑
这是有关$lsDate变量的更多信息。
$lsDate来自客户属性。我将日期存储为:
$newDate = new \DateTime();
$customer->setCustomAttribute('ls_start_date', $newDate->format('Y-m-d H:i:s'));
Run Code Online (Sandbox Code Playgroud)
并这样获取日期:
$lsDate = $customer->getCustomAttribute('ls_start_date')->getValue();
Run Code Online (Sandbox Code Playgroud) 我正在与位于与我的不同时区的服务器上开发一个带有MySQL数据库的Java应用程序,我正在尝试在我的数据库中使用DATETIME或TIMESTAMP.
在阅读问题后,我应该使用字段'datetime'还是'timestamp'?和MySQL文档一样,我认为TIMESTAMP对我来说更好,因为它将值转换为UTC进行存储,然后返回当前时区进行检索.
此外,正如用户Jesper在此线程中所解释的那样,java.util.Date对象在内部仅是UTC时间戳(即自Epoch以来的毫秒数),当您执行toString()时,它将根据您当前的时区显示.
对我来说,这看起来是一个好习惯:将日期时间存储为UTC时间戳,然后根据当前时区显示它们.
我就是这样做的,但后来我从Prepared Statements 的Java文档中找到了这个并且非常困惑:
void setTimestamp(int parameterIndex,Timestamp x,Calendar cal)抛出SQLException
使用给定的Calendar对象将指定参数设置为给定的java.sql.Timestamp值.驱动程序使用Calendar对象构造SQL TIMESTAMP值,然后驱动程序将该值发送到数据库.使用Calendar对象,驱动程序可以计算考虑自定义时区的时间戳.如果未指定Calendar对象,则驱动程序将使用默认时区,即运行应用程序的虚拟机的时区.
在此之前,我认为时间戳总是按UTC惯例.为什么人们想要一个本地化的时间戳而不是它的本地化表示?这对每个人来说都不会让人感到困惑吗?
这些转换如何运作?如果Java采用UTC时间戳并将其转换为任意时区,那么它如何告诉MySQL它在哪个时区呢?
MySQL不会假设此时间戳是UTC,然后检索不正确的本地化值吗?
我有一个带有timestamp字段的数据库,默认情况下它使用当前时间戳,但是我在时间上有问题,例如,如果我在9:00插入行,它将需要8作为时间戳。
所以我的问题是默认情况下如何使该表中的current_timestamp增加一小时?我知道您可以用php来做,但是我更喜欢纯MySQL解决方案。
我的服务器时区有问题,但是我不想更改它,因为我担心这可能会影响服务器上的其他数据库,而我只想更改一个数据库中的时间戳。
我需要将数据库从 SQL 转换为 MySQL,并且成功完成,但是,这个问题现在更适合 MySQL。
我注意到我可以将DateTime字符串插入到Timestamp列类型中,从我听说 Timestamp 接受 DateTime 或实际时间戳来看,这一切都很好,但是,我对 now 很好奇,"ON UPDATE CURRENT_TIMESTAMP"因为我把它放在了数据库的列,因为它只能用于Timestamp类型。这是否会使用不符合以下格式的时间戳: YYYY-MM-DD HH:MM:SS何时基于 进行更新CURRENT_TIMESTAMP?
这将如何影响我从该列中提取的数据?
例如,当某些日期可能是数字时间戳,而其他日期可能是 DATETIME 格式时,从 TIMESTAMP 列获取当前日期/时间是否会很困难?我是否应该仅使用 DATETIME 作为此列的类型,而无法ON_UPDATE避免来自此处数据库的混合数据的问题?
我有一个表(会话),它有 2 列,我必须用于此查询。Session_Active(这是一个 tinyInt)和 Last_active(这是一个日期时间)。
我想创建一个查询,计算现在和所有表的 'Last_active' 之间的时间差,其中 'Session_Active' 为真,如果它大于 5 分钟,它应该更改 'Session_Active'。
这是我所拥有的部分:
SELECT timediff(now(), `Last_Active`) from sessions WHERE `Session_Active` = true;
Run Code Online (Sandbox Code Playgroud)
我完全不知道如何检查差异是否大于 5 分钟,我也不知道在哪里/如何放置UPDATE Session_Active = false(如果差异是 5 分钟或更长时间)
提前致谢!(:
我DateTime在数据库中有一个对象mysql,例如包含此datetime "2017-08-14 18:06:40"对象,server/mysql默认时区是美国,因此当我插入它时,datetime它会进入美国时区。
我的问题是,当来自欧洲的用户选择该日期时间时,由于时间差异,它会有所不同,不是吗?
我该如何解决这个问题。我希望欧洲的用户获得相对于他们的时区的日期时间
我通过搜索发现
CONVERT_TZ(`comment_date`,@@global.time_zone,@@session.time_zone) AS comment_date,
Run Code Online (Sandbox Code Playgroud)
然后我发现需要设置@@session.time_zone不自动检测
那么我们如何解决这个问题?有哪些选项和技术apps可以用于datetime跨国家统一?
我想将NSDate保存到MySQL字段.哪种类型最好?DATE或TIMESTAMP?以及如何格式化我的NSDate发送它(到PHP脚本)并将其保存在我的字段中?
我想计算两个日期之间的时间间隔.所以这是我的代码
$start_date = new DateTime("$date1");
$end_date = new DateTime("$date2");
$interval = $start_date->diff($end_date);
$days = $interval->d;
$months = $interval->m;
$years = $interval->y;
$hours = $interval->h;
$mins = $interval->i;
$secs = $interval->s;
Run Code Online (Sandbox Code Playgroud)
当我尝试回显结果时,它返回一个空结果.
这个相同的代码在我的开发服务器和localhost上工作,一旦我改为另一台服务器就停止响应.
我检查了php.ini的时区设置,很不错.
我将非常感谢你的帮助
我的数据库中有一列名为time。此列的类型为timestamp,默认值为CURRENT_TIMESTAMP
但是在一些插入之后,phpMyAdmin它在其中将值显示为datetime,例如2019-05-05 04:24:45,甚至在那里也显示了时区并且可以更改!
我以为MySQL的时间戳是4个字节(相比于datetime的8个字节),并且不存储时区,数据与INT(10)相同,例如:(1557094115自1970年以来经过的秒数或类似的东西)
谁能解释一下,是bug还是什么?
MySQL版本5.7.25
这是一TIMESTAMP列,默认值为CURRENT_TIMESTAMP

正如您所看到的那样DATETIME,我无法将它与unix_timestamp的整数值进行比较...也可以将TimeZone更改为任何值(我认为时间戳记不存储时区...)

如果(基于一个答案)MySQL在内部将其存储为整数,那么为什么不能将其与整数进行比较?(以下查询无效)
DELETE FROM `table` WHERE time < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL :days DAY))
Run Code Online (Sandbox Code Playgroud)
SQLSTATE [22007]:无效的日期时间格式:1292错误的日期时间值:第1行的“时间”列为“ 1555980012”
我也在Sequel Pro和MySQLWorkbench中尝试了相同的结果
我有一个列,其中包含MySQL数据库中的时间戳.无论我更新记录多少次,我的时间戳都不会更新.我有什么办法让它自动更新吗?
在Stackoverflow中搜索其他问题,大多数人都说相反,它真的很混乱!例如,这个, 我应该使用字段'datetime'还是'timestamp'?(看看评分最高的答案)
谢谢
这是我的表格结构
+----------------+-------------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------------+-------------+------+-----+-------------------+----------------+
| Num | int(11) | NO | PRI | NULL | auto_increment |
| mem_name | varchar(50) | NO | | NULL | |
| mem_id | int(11) | NO | | NULL | |
| car_number | varchar(11) | NO | | NULL | |
| firstcall_time | timestamp | NO | | CURRENT_TIMESTAMP | |
| tow_time …Run Code Online (Sandbox Code Playgroud)