2013-05-23 3 views
0

Я довольно новичок в SAS, и недавно мы перенесли некоторые из наших наборов данных SAS в таблицу SQL Server, но мы все еще используем SAS для нашего анализа. Я столкнулся с проблемой, когда SAS пытается вносить данные из таблицы SQL Server и проверяет SAS, если дата srv_edt находится между датами SAS dos_beg_dt1 и dos_end_dt1.Форматы даты SAS, несовместимые с SQL Server Дата

Когда SAS пытается сравнить даты, я получаю сообщение об ошибке: Оператор ERROR: WHERE требует совместимых переменных.

Досье_beg_dt1, dos_end_dt1 и srv_edt (формат даты SQL) все «отображаются» в формате yyyy-mm-dd. Когда я привожу srv_edt в таблицу SAS, он считывает его как дату символа. Поэтому я попытался изменить формат дат, а затем я получу ошибку, например: ERROR: переменная srv_edt была определена как символ, так и числовая. Кажется, я не могу найти правильный формат или функцию, чтобы заставить SAS выполнить сравнение, чтобы узнать, находится ли srv_edt (SQL) между датами dos_beg_dt1 и dos_end_dt1 SAS.

код я использую следующим образом:

libname sql odbc dsn=test schema=dbo; 

%let dos_beg_dt1 = %sysfunc(intnx(qtr,&date,-1,beginning),yymmdd10.); 
%let dos_end_dt1 = %sysfunc(intnx(qtr,&date,-1,end),yymmdd10.); 

data sample; 
set sql.table; 
where &dos_beg_dt1 <= srv_edt <= &dos_end_dt1; 
run; 

Для справки я использую SAS 9.2 для подключения через ODBC к SQL Server 2008.

Любая помощь или совет будет весьма признателен.

ответ

1

SAS хранит и использует dats как числовые переменные. Если вы не указали столбец srv_edt в качестве столбца даты при переносе базы данных на SQL-сервер, все будет обрабатываться правильно.

Я предполагаю, что в настоящее время и в будущем вы просто сохраните таблицы на SQL-сервере, и вся обработка будет в SAS.

У вас есть несколько вариантов.

1/повторная миграция таблиц SAS, но все столбцы даты, времени и даты и времени как числовые. Все они могут быть сохранены как 8-байтовые с плавающей запятой. Переменные даты также могут быть сохранены (в SQL Server) длинными целыми числами. Для этого кода потребуется небольшое изменение, чтобы макропеременные были числовыми.

%let dos_beg_dt1 = %sysfunc(intnx(qtr,&date,-1,beginning)); 
%let dos_end_dt1 = %sysfunc(intnx(qtr,&date,-1,end)); 

2/сохранить дату, время и даты-времени переменные в формате SQL Server и изменить тип данных столбца при использовании данных. (Обратите внимание, что обратное будет необходимо на выходе).SQL Server представит переменные даты в виде строки (символ), так что ваше выражение выше необходимо будет -

%let dos_beg_dt1 = %sysfunc(intnx(qtr,&date,-1,beginning)); 
%let dos_end_dt1 = %sysfunc(intnx(qtr,&date,-1,end)); 

data sample; 
set sql.table; 

where &dos_beg_dt1 <= (input(srv_edt, yymmdd10.0)) <= &dos_end_dt1; 

Это, чтобы убедиться, что при использовании SAS обработки типа является числовым, который является то, что входная функция будет делать.

3/сохранить переменные date, time и datetime в формате SQL Server и изменить свою работу с учетом этого факта. То есть сравнения будут использовать символьные данные, а вывод должен будет генерировать символы. SQL Server представит переменные даты в виде строки (символ), так что ваше выражение выше необходимо будет -

%let dos_beg_dt1 = %sysfunc(intnx(qtr,&date,-1,beginning), yymmdd10.); 
%let dos_end_dt1 = %sysfunc(intnx(qtr,&date,-1,end), yymmdd10.); 

data sample; 
set sql.table; 

where ("&dos_beg_dt1" <= srv_edt) and 
    (srv_edt <= "&dos_end_dt1");` 

Примечание двойные кавычки «» требуется окружающая макропеременные как это сравнение числовыми.

+0

Благодарим вас за все возможные варианты! Поскольку я не могу повторно перенастроить данные, которые я использую, я смог предложить вам ваши данные, чтобы вытащить данные за указанный период времени. – Trish

0

Если столбец srv_edt показывает в данной SAS, установленных в качестве символьного переменного, это означает, что это действительно переменный характер или он был преобразован в символ драйвер ODBC, который вы используете (возможно потому, что нативный данные тип не поддерживается ODBC).

Вам было бы лучше сменить это на запрос PROC SQL pass-thru, если это возможно. Вам нужно будет выяснить собственный синтаксис, соответствующий функции SAS intnx (и я не могу вам помочь). Как написано, вся таблица должна быть прочитана (потому что вы используете функцию SAS). Если вы используете запрос pass-thru, SAS будет получать только строки, соответствующие условию whee.

Возможно, в драйвере ODBC есть настройка, которая управляет этим поведением. Я добавлю теги ODBC и SQL Server к вашему вопросу; вы можете получить больше «хитов».

0

SQL Server представил новые даты и типы данных в SQL Server 2008 (ранее для всех переменных даты и даты использовался только один тип). This usage note предполагает, что вам необходимо установить новый набор драйверов ODBC для SQL Server для SAS, чтобы правильно прочитать переменные даты. Он предполагает, что это будет установлено нормально, если на компьютере, использующем ODBC-соединение, есть инструменты SQL Server 2008 (например, SQL Server Management Studio), но у вас может быть установлено несколько драйверов, и вам необходимо убедиться, что вы используете правильный.

При этом неплохо было бы использовать сквозной SQL, чтобы вытащить данные, поскольку это может облегчить выполнение тяги (так как вам не нужно беспокоиться о драйвере ODBC). Обобщенные проходит через строку подключения

proc sql; 
    connect to odbc (required="driver=sql server native client 10.0; 
Server=server;Trusted_Connection=Yes;DATABASE=database;"); 
    create table X as select * from connection to odbc(... sql server native code here ...); 
quit; 

Из Вашего вопроса это звучит, как вы больше SQL человека и затем можно построить запрос самостоятельно; если вы этого не сделаете, отредактируйте вопрос, чтобы включить этот запрос (а затем ответит либо сам SQL Server, либо я). Вы можете использовать макросы SAS в этом запросе (т. Е. Передать текущую дату), если вы не вставляете их или запрос в одинарные кавычки.

Смежные вопросы