我需要将(MSSQL)数据库表中的数据库列转换为UNIX time_t。问题是该列没有时区,有些日期来自GMT(+0000),有些日期来自BST(+0100)。我正在英国工作。
有没有可靠的方法将未分区的日期时间转换为UNIX time_t?我正在使用
SELECT *,DATEDIFF(second,'1970-01-01',event_time)
但这似乎受当前时区的影响,而不适用于该日期。
我不介意我在SQL或代码中进行转换。我在Perl工作。
答案 0 :(得分:3)
如果你的意思是时间是夏季的BST和冬季的GMT那么是列中隐含的时区,并且它不是“两个不同的时区”,它是一个时区,称为{{ 1}}在Olson DB中或Europe/London
在POSIX TZ格式中。您应该能够轻松地使用DateTime模块转换这些时间,甚至可以巧妙地使用POSIX函数,除了秋季转换周围的模糊小时,除非您存储BST是否存在指示,否则无法解决当时是否生效。
使用GMT0BST,M3.5.0/1,M10.5.0/2
的示例:
DateTime
答案 1 :(得分:1)
使用SQL 2008,有一个新的日期时间类型:datetimeoffset
保留时区信息,因此可用于从Unix纪元中提取差异。但这需要升级到SQL 2008,重新访问您的架构并更改列类型并追溯更新所有现有数据以设置正确的时区。
如果您无法升级到SQL 2008,那么我建议您将日期时间信息始终存储为UDT,这意味着在将其插入数据库之前先将其转换为客户端。在appopiate当地时间向用户显示数据应该再次在客户端完成。
答案 2 :(得分:0)
UNIX时间戳是UTC,没有夏令时。因此,如果您无法确定日期是GMT还是BST,则无法将其转换为UNIX时间戳。