我知道这听起来很愚蠢,但是当我使用时
SELECT CONVERT_TZ('2004-01-01 12:00:00','UTC','Asia/Jakarta') AS time
Run Code Online (Sandbox Code Playgroud)
它输出NULL.我在Ubuntu 12.04 64位中使用MySQL Workbench,它可以在我的其他笔记本电脑/操作系统(也使用MySQL Workbench)中运行.
MySQL能否将存储的UTC时间直接转换为本地timezon:ed时间直接在正常的select语句中?
假设您有一些带有时间戳(UTC)的数据.
CREATE TABLE `SomeDateTable` (
`id` int(11) NOT NULL auto_increment,
`value` float NOT NULL default '0',
`date` datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (`id`)
)
Run Code Online (Sandbox Code Playgroud)
然后,当我
"select value, date from SomeDateTable";
Run Code Online (Sandbox Code Playgroud)
我当然得到他们存储的UTC表格中的所有日期.
但是,让我们说我希望将它们放在另一个时区(使用DST),然后我可以在select查询中添加一些魔法,以便我在所选时区中获取所有日期吗?
"select value, TIMEZONE(date, "Europe/Berlin") from SomeDateTable";
Run Code Online (Sandbox Code Playgroud)
或者我必须在顶部的其他层中执行此操作,例如在某些PHP代码中?(似乎大多数人都解决了这个问题).
谢谢约翰
如果你的MySQL安装允许你使用CONVERT_TZ它是一个非常干净的解决方案,这个例子展示了如何使用它.
SELECT CONVERT_TZ( '2010-01-01 12:00', 'UTC', 'Europe/Stockholm' )
Run Code Online (Sandbox Code Playgroud)
但是我不知道这是不是一个好方法,因为有些MySQL安装缺少这个功能,请小心使用.
我正在使用MySql Database.Iy中的一个查询中的Where Condition.我的问题是我的表中有一个displaytime列,但该表列显示UTC时间中的数据.我想在本地时间转换该displaytime列Zone.so如何从查询本身提供此工具.
我已经对这些东西进行了调整,并且我知道那样的东西SELECT CONVERT_TZ()
会起作用.但它不适合我.
这是我的查询,我需要将显示时间转换为本地时区...所以有人可以指导我吗?
WHERE displaytime >= '2012-12-01 00:00:00'
AND displaytime <='2013-02-22 23:59:59'
AND ct.organizationId IN (
SELECT t.organizationId
FROM organization_ AS t
JOIN organization_ AS p ON t.treePath LIKE CONCAT(p.treePath, '%')
WHERE p.organizationId = 10707
Run Code Online (Sandbox Code Playgroud)
样本数据
我正在尝试设置一个数据库,用于存储用户指定的每日警报时间.例如,如果在每天上午7:00到7:30之间满足某些标准,则用户想要接收警报.在尝试实现这一点时,我需要适应夏令时.这是我尝试的解决方案:
CONVERT_TZ(UTC_TIME(), 'UTC', userInfo.tz)
.问题1.根据我的理解,指定时区名称(如美国/东部)应考虑夏令时.例如,CONVERT_TZ('00:00:00', 'UTC', 'US/EASTERN')
1月1 日的呼叫应该会产生'19:00:00',但是在7月1日,呼叫应该产生'20:00:00'.我对么?
问题2.如果Q1正确,我是否需要不断更新MySQL的时区表以保持时区UTC偏移最新?
问题3. MySQL文档中给出的示例在我的服务器上运行时SELECT CONVERT_TZ('2004-01-01 12:00:00','GMT','MET')
产生" NULL
".这可能是由于没有设置时区表造成的吗?
我怎么检查这个?
这听起来很简单但我无法弄清楚如何使用简单的SELECT语句来返回GMT中的当前时间.
我一直在尝试使用CONVERT_TZ()根据服务器时区和GMT时区将NOW()转换为GMT,但由于某种原因,当我放入文本时区时它返回NULL.我得到结果的唯一方法是实际放入偏移量,这对于应该是一个非常简单的操作来说太复杂了.这就是我的意思:
mysql> SELECT CONVERT_TZ(NOW(),@@global.system_time_zone,'GMT');
NULL
mysql> SELECT CONVERT_TZ(NOW(),'PST','GMT');
NULL
mysql> SELECT CONVERT_TZ(NOW(),'-08:00','+00:00');
2010-02-13 18:28:22
Run Code Online (Sandbox Code Playgroud)
我只需要一个简单的查询来返回GMT中的当前时间.在此先感谢您的帮助!
我创建了一个样本表,其场景与原始场景相同。数据库“测试”中的表名称“记录”
数据库时区设置为UTC(SET time_zone =“ +00:00”;)
`records`(`id`,`name`,`time_created`) (1,'motion','2017-09-13 16:20:41'), (2,'motion','2017-09-13 16:20:57'), (3,'motion','2017-09-13 16:21:24'), (4,'motion','2017-09-13 16:21:40'), (5,'motion','2017-09-13 16:26:38'), (6,'motion','2017-09-13 17:09:00'), (7,'motion','2017-09-13 17:09:16'), (8,'motion','2017-09-13 22:14:37'), (9,'motion','2017-09-13 22:23:53'), (10,'motion','2017-09-13 22:24:08'), (11,'motion','2017-09-13 22:24:24'), (12,'motion','2017-09-13 23:45:17'), (13,'motion','2017-09-13 23:45:36'), (14,'motion','2017-09-13 23:45:54'), (15,'motion','2017-09-14 00:07:09'), (16,'motion','2017-09-14 00:07:24'), (17,'motion','2017-09-14 00:07:42'), (18,'motion','2017-09-19 09:42:11'), (19,'motion','2017-09-19 09:42:27'), (20,'motion','2017-09-19 09:42:44'), (21,'motion','2017-09-19 11:21:08'), (22,'motion','2017-09-19 11:21:23'), (23,'motion','2017-09-19 11:21:38'), (24,'motion','2017-09-19 11:21:54'), (25,'motion','2017-09-19 11:48:13'), (26,'motion','2017-09-13 16:20:41'), (27,'motion','2017-09-13 16:20:57'), (28,'motion','2017-09-13 16:21:24'), (29,'motion','2017-09-13 16:21:40'), (30,'motion','2017-09-13 16:26:38'), (31,'motion','2017-09-13 17:09:00'), (32,'motion','2017-09-13 17:09:16'), (33,'motion','2017-09-13 22:14:37'), (34,'motion','2017-09-13 22:23:53'), (35,'motion','2017-09-13 22:24:08'), (36,'motion','2017-09-13 22:24:24'), (37,'motion','2017-09-13 23:45:17'), …
什么是存储日期时间的实用方法,以便我可以让用户查看/查询自己当地时间的数据,同时保留有关原始日期时间的信息.
基本上,用户希望能够查询(从他们自己的本地时间)从各个时区的系统收集的数据.但偶尔,他们想知道数据是在原始系统中的18:00创建的.当来自世界不同地区的用户就同一事件进行通信时,它会有所帮助.
User1: What? We don't have any data for 20:00
User2: Dude, it says 20:00 right there on my screen.
User1: Wait, what timezone are you? What's the UTC-time?
User2: What is UTC? Is that something with computers?
User1: OMFG! *click*
Run Code Online (Sandbox Code Playgroud)
我正在寻找有关如何存储数据的建议.
我正在考虑以UTC格式存储所有日期时间,并添加一个包含原始时区名称的附加列,其形式允许我使用mysql CONVERT_TZ
或Java中的对应物.然后,应用程序将用户输入的日期转换为UTC,我可以轻松查询数据库.所有日期也可以轻松转换为应用程序中的用户本地时间.使用原始时区列我也可以显示原始日期时间.
但是,这意味着对于我所拥有的每个日期时间,我需要一个额外的列...
start_time_utc datetime
start_time_tz varchar(64)
end_time_utc datetime
end_time_tz varchar(64)
Run Code Online (Sandbox Code Playgroud)
我在这里走在正确的轨道上吗?
是否有人使用这些数据分享他们的经验?
(我将使用MySQL 5.5 CE)
更新1
数据将以xml文件的形式提供,其中每个条目在某个本地时区具有日期时间.因此,只有一个插入过程,在一个地方运行.
一旦加载到数据库中,它将在一些Web应用程序中呈现给不同时区的用户.对于大多数用例,感兴趣的数据也来自与查看数据的用户相同的时区.对于一些更复杂的用例,一系列事件是互连的并跨越多个时区.因此,用户希望能够谈论事件,以便在另一个时间调查可能的原因/后果.不是UTC,不是他们当地的时间.
我在mysql中有一个查询,比较这样的2个日期
convert_tz(updatedDate,'+05:30','-05:00') < ?
Run Code Online (Sandbox Code Playgroud)
convert函数返回美国时间中createddate列的值.当我在mysql查询浏览器中运行此查询时
convert_tz(updatedDate,'+05:30','-05:00') < '2013-04-14 09:30:00'
Run Code Online (Sandbox Code Playgroud)
例如,它给了我正确的值
product count
------- ------
A 123
B 7
Run Code Online (Sandbox Code Playgroud)
现在,我正在使用像这样的PreparedStatement在java中设置它
pst.setTimestamp(1, new java.sql.Timestamp(end.getTimeInMillis()));
rs=pst.executeQuery();
System.out.println("=====new Open Tickets Query executed=====");
System.out.println(pst);
Run Code Online (Sandbox Code Playgroud)
最后一行打印整个查询,值集是
convert_tz(updatedDate,'+05:30','-05:00') < '2013-04-14 09:30:00'
Run Code Online (Sandbox Code Playgroud)
但它给了我不同的价值观
product count
------- ------
A 155
B 19
Run Code Online (Sandbox Code Playgroud)
所以,我怀疑是我将代码更改为TimeZone问题
end.setTimeZone(TimeZone.getTimeZone("America/New York"));
pst.setTimestamp(1, new java.sql.Timestamp(end.getTimeInMillis()));
rs=pst.executeQuery();
System.out.println("=====new Open Tickets Query executed=====");
System.out.println(pst);
Run Code Online (Sandbox Code Playgroud)
但它仍然给出了同样错误的结果.
更多信息:我如何设置日历结束变量
我有一个Web应用程序,它给我日期字符串"2013-04-14 09:30:00"
DateFormat df1=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
Calendar end=Calendar.getInstance();
end.setTime(df1.parse(endString));
end.set(Calendar.HOUR, 9);
end.set(Calendar.MINUTE, 30);
end.set(Calendar.SECOND, 0);
Run Code Online (Sandbox Code Playgroud)
另外,对于实验我尝试使用java.util.Date对象,它给我正确的结果以下是代码
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
end.setTime(sdf.parse("2012-10-01 00:00:00")); …
Run Code Online (Sandbox Code Playgroud) 我试图将UTC时间转换为用户本地时间,它工作正常,直到我尝试将时间转换为+14:00时区,结果始终为null,任何人都有想法?这是我的代码:
select CONVERT_TZ(now(), '+00:00', '+14:00')
Run Code Online (Sandbox Code Playgroud) 我是solr的新手,这是我第一次尝试索引solr数据,我在索引时得到以下异常,
org.apache.solr.common.SolrException:无效的日期字符串:在org.apache.solr.schema.TrieDateField的org.apache.solr.schema.DateField.parseMath(DateField.java:165)中的'2011-01-07' .orgateField(TrieDateField.java:169)org.apache.solr.schema.SchemaField.createField(SchemaField.java:98)org.apache.solr.update.DocumentBuilder.addField(DocumentBuilder.java:204)org. apache.solr.update.DocumentBuilder.toDocument(DocumentBuilder.java:277)
我从阅读一些文章中了解到Solr只在UTC中存储时间,这是我想要索引的查询,
选择id,文本,'language',链接,tweetType,source,location,bio,url,utcOffset,timeZone,frenCnt,createdAt,createdOnGMT,createdOnServerTime,follCnt,favCnt,totStatusCnt,usrCrtDate,humanSentiment,replyly,replyMsg,classified,locationDetail ,geonameid,country,continent,placeLongitude,placeLatitude,listedCnt,hashtag,mentions,senderInfScr,createdOnGMTDate,DATE_FORMAT(CONVERT_TZ(createdOnGMTDate,'+ 00:00','+ 05:30'),'%Y-%m-% d')作为IST,DATE_FORMAT(CONVERT_TZ(createdOnGMTDate,'+ 00:00','+ 01:00'),'%Y-%m-%d')为ECT,DATE_FORMAT(CONVERT_TZ(createdOnGMTDate,'+ 00) :00','+ 02:00'),'%Y-%m-%d')为EET,DATE_FORMAT(CONVERT_TZ(createdOnGMTDate,'+ 00:00','+ 03:30'),'%Y - %m-%d')作为MET,签名(分类)为来自的情绪
我为什么要进行此时区转换是因为我需要按用户时区对结果进行分组.我怎样才能实现这一目标?
此致,罗希特