2015-03-20 2 views
0

У меня есть таблица, которая имеет некоторую базовую информацию о пациентах имени амбулаторное:SAS функция мин и дата форматирования проблема

ID Date 
A 10/04/11 
B 10/18/11 
C 11/30/11 

В SAS, когда я проверяю столбец Date, я вижу, что он имеет формат MMDDYY8. и сообщить DATETIME20. Для еще один шаг, когда мне нужно найти мин Дата:

proc sql; 
create table outpatient2 as 
select distinct ID, min(Date) as first_date datetime. 
from outpatient 
group by ID; 
quit; 

Когда я проверяю выход это выглядит следующим образом:

ID first_date 
A 01JAN60:05:15:05 
B 01JAN60:05:15:03 
C 01JAN60:05:15:52 

Потому что у меня не было времени, мое плохое исправить вокруг было послать амбулаторное таблицу оракула и вызвать к нему с помощью этого:

from userid.outpatient 

я проверить версию оракула САЦА, установив его в шаге данных и, кажется, что формат и как информ DATETIME20. Но используя плохое исправление вокруг я получаю правильный вывод, что я искал:

ID first_date 
A 05OCT11:00:00:00 
B 25MAY11:00:00:00 
C 09AUG11:00:00:00 

Игнорируйте даты точно, они вроде случайного примера, чтобы показать, что, когда дата отформатированный MMDDYY8. и min (Date), возвращается нечетная дата, но если Date отформатирован DATETIME20. он возвращает правильную дату.

Редактировать: Нет пустых DATE, и хотя шаг outpatient2 завершается, я получаю значение ERROR: Date вне диапазона.

+0

Если у вас есть информация о времени и формате mmddyy8, исходные данные представлены неверно. Вы говорите, что исправили это, но не так, так трудно сказать, что не так. Ваш информационный/формат должен соответствовать дате/дате, т.е. неформальному дат-времени требуется формат даты и времени, а информатору даты нужен формат даты. – Reeza

+0

Извините, но когда я упомянул о плохом исправлении, он буквально отправлял его в оракул и вызывал таблицу, которая шла к оракулу. Я предполагаю, что мне нужно отформатировать его до DATETIME20. также? – PinkyL

ответ

1

Вы не можете преобразовать данные с даты в дату и время, используя только форматы, вам нужно использовать функции. Кроме того, у вас есть неправильный неофициальный набор в вашем исходном наборе данных, форматы даты и времени не должны применяться к переменным даты.

Ниже приведен пример репликации вашей проблемы и правильный способ получения результата на основе ваших данных.

*Generate sample data with properties described in question; 
data have; 
informat dt_bad datetime20.; 
format dt_bad mmddyy8.; 
dt_bad=mdy(2, 12, 2014); output; 
dt_bad=mdy(3, 13, 2014); output; 
dt_bad=mdy(4, 20, 2013); output; 
run; 

proc print data=have; 
run; 

*Your code which generates incorrect output; 
proc sql; 
create table wrong_output as 
select min(dt_bad) as bad_date format=datetime20. 
from have; 
quit; 

proc print data=wrong_output; 
run; 

*one correct way to convert a date variable to datetime variable; 
proc sql; 
create table correct_output as 
select dhms(min(dt_bad), 0, 0, 0) as good_date format=datetime20. 
from have; 
quit; 

proc print data=correct_output; 
run; 
+0

Большое вам спасибо! Я буду использовать это, чтобы проверить свою проблему. – PinkyL

1

Посмотрите, можете ли вы получить дату из переменной, используя функцию DATEPART. Существует также TIMEPART.

ActualDate=datepart(date); 
ActualTime=timepart(date); 
format actualdate mmddyy8. actualtime time.; 
Смежные вопросы