2017-07-17 573 views
2

我试图将SAS日期时间转换为UNIX时间戳,但在结果中获得了8小时的差异。我认为这与时区问题有某种关系,但我无法弄清楚。将SAS日期时间转换为SAS中的UNIX时间戳

首先,我在mySQL中运行以下语句以获得所需的结果。

查询:

SELECT UNIX_TIMESTAMP('2017-01-01 00:00:00') AS wanted_unix_timestamp 

结果:

UNIX_TIMESTAMP('2017-01-01 00:00:00') 
--------------------------------------- 
          1483221600 

然后我试着写SAS代码至SAS时间值转换成数字,但它似乎为8小时的休息时间:

%let wanted_unix_timestamp = 1483221600; 

%let sas_epoch = '01jan1960:00:00:00'dt; 
%let unix_epoch = '01jan1970:00:00:00'dt; 
%let unix_timestamp_offset = %sysfunc(intck(seconds,&sas_epoch,&unix_epoch)); 

%let sas_datetime = %sysfunc(dhms(%sysfunc(mdy(1,1,2017)),0,0,0)); 

%let unix_timestamp = %eval(&sas_datetime - &unix_timestamp_offset); 

%put &=sas_datetime; 
%put &=unix_timestamp_offset; 
%put &=unix_timestamp; 
%put %eval(&wanted_unix_timestamp - &unix_timestamp); 

结果:

SAS_DATETIME=1798848000 
UNIX_TIMESTAMP_OFFSET=315619200 
UNIX_TIMESTAMP=1483228800 
-7200 

基于一些谷歌搜索我的抵消似乎是正确的。我也尝试在mySQL中将会话时区设置为不同的时区,以查看是否通过使用SET SESSION time_zone = 'US/Pacific';SET SESSION time_zone = 'Europe/Helsinki';而产生差异,但它们对输出没有影响。

编辑:我正在使用SAS 9.4,所以如果有更简单的方法去解决这个问题,那么我很乐意将它作为答案。

回答

1

你几乎肯定会受到时区的影响,因为UNIX_TIMESTAMP将当前时间从1970-01-01 00:00:00 UTC返回秒数。因此,8小时的差异(在太平洋时区)。

mySQL reference on session time zones,设置会话时区不影响UTC_TIMESTAMP,虽然它并没有直接提到UNIX_TIMESTAMP,它可能具有相同的非的效果存在。

+1

不是MySQL人员,但我认为他可以将它与'CONVERT_TZ()'函数结合以反转UTC偏移量。 – DomPazz

+0

有道理,我不是一个真正的MySQL人,因此犹豫不决提出具体的修复方法,但看起来似乎应该起作用。 – Joe

+0

@RobertPenr​​idge - 如果Dom的解决方案有效,我会很乐意将其编辑到我的答案中(或者您或Dom可以随意发布一个单独的答案),请让我们知道。 – Joe

相关问题