如何将Datetime转换为SAS格式

如何将Datetime转换为SAS格式,sas,Sas,我在不同版本的不同表格中处理大量观察结果 我将使用日期%let date_to_view=“20JAN2014:16:10”dt 但是如何将这个日期转换成SAS格式呢 我知道如何转换SAS数据类型(使用proc sql): 我看到日期2014年1月20日:16:34:10是1390224849927,但如何将其转换为代码?“2014年1月20日:16:10”dt已采用正确的SAS日期(datetime)格式,但作为日期文字。SAS将其存储为一个数字,表示自1960年1月1日起的秒数 如果只需要d

我在不同版本的不同表格中处理大量观察结果

我将使用日期
%let date_to_view=“20JAN2014:16:10”dt
但是如何将这个日期转换成SAS格式呢

我知道如何转换SAS数据类型(使用proc sql):

我看到日期
2014年1月20日:16:34:10
1390224849927
,但如何将其转换为代码?

“2014年1月20日:16:10”dt已采用正确的SAS日期(datetime)格式,但作为日期文字。SAS将其存储为一个数字,表示自1960年1月1日起的秒数

如果只需要datetime的日期组件,请使用
datepart()
函数,并相应地格式化结果,例如
date9.

data want ; dt = "20JAN2014:16:10"dt ; date = datepart(dt) ; format dt datetime19. date date9. ; /* To have 'date' show as the unformatted value, simply remove the format */ format date best32. ; run ; 数据需求; dt=“2014年1月20日:16:10”dt; 日期=日期部分(dt); 格式dt datetime19。日期9; /*要使“date”显示为未格式化的值,只需删除格式*/ 格式日期为32; 跑 “2014年1月20日:16:10”dt已采用正确的SAS日期(datetime)格式,但作为日期文字。SAS将其存储为一个数字,表示自1960年1月1日起的秒数

如果只需要datetime的日期组件,请使用
datepart()
函数,并相应地格式化结果,例如
date9.

data want ; dt = "20JAN2014:16:10"dt ; date = datepart(dt) ; format dt datetime19. date date9. ; /* To have 'date' show as the unformatted value, simply remove the format */ format date best32. ; run ; 数据需求; dt=“2014年1月20日:16:10”dt; 日期=日期部分(dt); 格式dt datetime19。日期9; /*要使“date”显示为未格式化的值,只需删除格式*/ 格式日期为32; 跑 在您的公式
dhms(“01JAN1970'd,3,0,i.valid\u dttm/1000)
中,您正在将表示自1970年1月1日起毫秒数的数字转换为表示自1960年1月1日起秒数的SAS datetime值。您似乎还在添加3小时

因此,听起来您的问题是如何将SAS DATETIME值转换为Unix时间戳值

从Unix时间戳转换为SAS日期时间的公式为:

sasdt2 = '01JAN1970:00:00'dt + '03:00't + unix_timestamp2/1000 ;
因此,要将SAS datetime值转换为Unix时间戳,请使用:

unix_timestamp1 = 1000*(sasdt1 - '01JAN1970:00:00'dt - '03:00't) ;
在公式
dhms(“01JAN1970'd,3,0,i.valid\u dttm/1000)
中,您将表示自1970年1月1日起毫秒数的数字转换为表示自1960年1月1日起秒数的SAS日期时间值。您似乎还需要增加3个小时

因此,听起来您的问题是如何将SAS DATETIME值转换为Unix时间戳值。所以只要把算术颠倒过来就行了

从Unix时间戳转换为SAS日期时间的公式为:

sasdt2 = '01JAN1970:00:00'dt + '03:00't + unix_timestamp2/1000 ;
因此,要将SAS datetime值转换为Unix时间戳,请使用:

unix_timestamp1 = 1000*(sasdt1 - '01JAN1970:00:00'dt - '03:00't) ;

谢谢你的评论,但我需要的日期是“1390224849927”我如何才能得到他的格式?我得到的“1705854850”仍然不是1390224849927 smth错误。。。我确定日期,因为我从1390224849927获得2014年1月20日16:10我不确定您从哪里获得1390224849927。“2014年1月20日:16:10”dt将导致1705853400。SAS date和datetime文本将始终显示为数字,除非您指定格式(例如date9.,datetime.)。你能把你写的代码发到1390224849927吗?谢谢你的评论,但是我需要的日期是“1390224849927”。我怎样才能得到他的格式?我得到的“1705854850”仍然不是1390224849927 smth错误。。。我确定日期,因为我从1390224849927获得2014年1月20日16:10我不确定您从哪里获得1390224849927。“2014年1月20日:16:10”dt将导致1705853400。SAS date和datetime文本将始终显示为数字,除非您指定格式(例如date9.,datetime.)。您可以发布您编写的代码,使您可以访问1390224849927吗?您发布的日期时间值与您发布的整数值不匹配。你发布的数字太大了。2014年1月的特定时间的存储值应仅为1705854850。您发布的日期时间值与您发布的整数值不匹配。你发布的数字太大了。2014年1月的那个特定时间的存储值应该只有1705854850。哦,谢谢。我不擅长Unix等格式,但如何将其格式设置为“1390224849927”将是1.39022249E12?只有在打印时,格式才重要。它不会更改存储的值。你只需要数一数你需要的位数。长度('1390224849927')为13。所以如果你使用13的格式。(也称为F13。)。或者再长一点也行。哦,谢谢。我不擅长Unix等格式,但如何将其格式设置为“1390224849927”将是1.39022249E12?只有在打印时,格式才重要。它不会更改存储的值。你只需要数一数你需要的位数。长度('1390224849927')为13。所以如果你使用13的格式。(也称为F13。)。或者更长的时间也可以。