AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 78899554
Accepted
EsotericPunk
EsotericPunk
Asked: 2024-08-22 10:09:32 +0800 CST2024-08-22 10:09:32 +0800 CST 2024-08-22 10:09:32 +0800 CST

Tentando criar uma variável de macro de data para usar em uma instrução WHERE

  • 772

Durante toda a minha vida, não consigo descobrir como corrigir esses formatos para uma macro de data utilizável. Tenho duas informações que desejo usar para criar variáveis ​​de macro de data. O primeiro é um ano e o segundo é uma tag que me informa se eu crio as variáveis ​​para um determinado ano ou para o ano anterior. Por exemplo, se eu definir o ano como 2025 e o período como PREV, quero criar as variáveis ​​de data para 2024. As datas que desejo são o início do ano, o final do ano, 6 meses antes do início e 6 meses depois. o fim. Estou procurando que todos tenham o formato 01JAN2024.

Tenho rastreado fóruns e o site de ajuda do SAS e tentei mil combinações. Não consigo encontrar nada que funcione e nem sei como imprimir corretamente os resultados para verificar. Aqui está o que tentei mais recentemente:

%let year   = 2025;
%let period     = PREV;
%let start_date = %sysfunc(mdy(1, 1, &meas_yr));

%macro set_dates;
    %if &period = PREV 
    %then %do;
        %let p_start = %sysfunc(intnx(year, &start_date, -1, beg));
        %let p_end   = %sysfunc(intnx(year, &start_date, -1, end));
        %let period_start  = %sysfunc(putn(&p_start, date9.));
        %let period_end    = %sysfunc(putn(&p_end,   date9.));
    %end;
    %else %do;
        %let p_start = %sysfunc(intnx(year, &start_date,  0, beg));
        %let p_end   = %sysfunc(intnx(year, &start_date,  0, end));
        %let period_start  = %sysfunc(putn(&p_start, date9.));
        %let period_end    = %sysfunc(putn(&p_end,   date9.));
    %end;
%mend set_dates;
%set_dates;

%let period_lkbk  = %sysfunc(intnx(month, &p_start., -6, beg), date9.);
%put &period_lkbk;
%let period_lkfw  = %sysfunc(intnx(month, &p_end.,    6, end), date9.);
%put &period_lkfw;

A seguir está meu código para testar o que está sendo definido:

%put Date_Test_1 : %sysfunc(putn(&p_start, date9.));
%put Date_Test_2 : &period_start;
%put Date_Test_3 : %sysfunc(putn(&p_end,   date9.));
%put Date_Test_4 : &period_end;
%put Date_Test_5 : &period_lkbk;

E os resultados que obtenho são:

SYMBOLGEN:  Macro variable P_START resolves to 23376
27         
28         %put Date_Test_1 : %sysfunc(putn(&p_start, date9.));
Date_Test_1 : 01JAN2024
29         %put Date_Test_2 : &period_start;
SYMBOLGEN:  Macro variable PERIOD_START resolves to 01JAN2024
Date_Test_2 : 01JAN2024
30         %put Date_Test_3 : %sysfunc(putn(&p_end,   date9.));
WARNING: Apparent symbolic reference P_END not resolved.
WARNING: Apparent symbolic reference P_END not resolved.
ERROR: Argument 1 to function PUTN referenced by the %SYSFUNC or %QSYSFUNC macro function is not a number.
ERROR: Invalid arguments detected in %SYSCALL, %SYSFUNC, or %QSYSFUNC argument list.  Execution of %SYSCALL statement or %SYSFUNC 
   or %QSYSFUNC function reference is terminated.
Date_Test_3 :
31         %put Date_Test_4 : &period_end;
SYMBOLGEN:  Macro variable PERIOD_END resolves to 31DEC2024
Date_Test_4 : 31DEC2024
32         %put Date_Test_5 : &period_lkbk;
SYMBOLGEN:  Macro variable PERIOD_LKBK resolves to 01JUL2023
Date_Test_5 : 01JUL2023
33         %put Date_Test_6 : &period_lkfw;
SYMBOLGEN:  Macro variable PERIOD_LKFW resolves to .
Date_Test_6 : .

Eventualmente eu quero usar isso em uma instrução dentro do proc sql assim:

WHERE startdate >= "&period_lkbk."d and enddate <= "&period_lkfw."d;

Por que p_end não está resolvendo? Sinto que estou perto, mas não consigo chegar à linha de chegada.

date
  • 1 1 respostas
  • 19 Views

1 respostas

  • Voted
  1. Best Answer
    Tom
    2024-08-22T13:12:50+08:002024-08-22T13:12:50+08:00

    Sua macro atribui um valor a PERIOD_END (e P_START etc.), mas não há nenhum código que garanta que PERIOD_END foi definido fora da macro, ao contrário de START_DATE, onde há uma instrução %LET em código aberto para criá-lo na macro GLOBAL escopo antes de começar a executar a macro. Como as variáveis ​​da macro ainda não existem, as instruções %LET dentro de uma definição de macro criarão variáveis ​​de macro LOCAL, que desaparecerão quando a macro terminar.

    Como não há nada no código que precise de uma macro, você pode tentar eliminar a definição da macro.

    %let year   = 2025;
    %let period     = PREV;
    %let start_date = %sysfunc(mdy(1, 1, &year));
    
    %if &period = PREV %then %do;
      %let p_start = %sysfunc(intnx(year, &start_date, -1, beg));
      %let p_end   = %sysfunc(intnx(year, &start_date, -1, end));
      %let period_start  = %sysfunc(putn(&p_start, date9.));
      %let period_end    = %sysfunc(putn(&p_end,   date9.));
    %end;
    %else %do;
      %let p_start = %sysfunc(intnx(year, &start_date,  0, beg));
      %let p_end   = %sysfunc(intnx(year, &start_date,  0, end));
      %let period_start  = %sysfunc(putn(&p_start, date9.));
      %let period_end    = %sysfunc(putn(&p_end,   date9.));
    %end;
    %put &=year &=period &=start_date ;
    %put &=p_start &=p_end &=period_start &=period_end;
    
    %let period_lkbk  = %sysfunc(intnx(month, &p_start., -6, beg), date9.);
    %put &=period_lkbk;
    %let period_lkfw  = %sysfunc(intnx(month, &p_end.,    6, end), date9.);
    %put &=period_lkfw;
    

    Resultados

    YEAR=2025 PERIOD=PREV START_DATE=23742
    P_START=23376 P_END=23741 PERIOD_START=01JAN2024 PERIOD_END=31DEC2024
    PERIOD_LKBK=01JUL2023
    PERIOD_LKFW=30JUN2025
    

    Dica:

    Para tornar sua programação de macro mais fácil de entender e manter, não use variáveis ​​de macro "mágicas" dentro de sua definição de macro. Com isso quero dizer que você precisa ter um propósito ao projetar se as variáveis ​​de macro que você faz referência (e aquelas que você cria) serão LOCAIS para a macro (para que desapareçam quando a execução da macro terminar) ou EXTERNAS para a macro (para que elas permanecem após a conclusão da macro). Você nem tem comentários que ajudem o próximo usuário (que provavelmente será seu) a entender qual era o seu plano.

    Então talvez você queira uma macro como esta que receba duas entradas e gere 5 variáveis ​​​​de macro GLOBAIS.

    %macro set_dates(year,period);
    %global start_date p_start p_end period_start period_end ;
    %let start_date = %sysfunc(mdy(1, 1, &year));
    %if &period = PREV %then %do;
      %let p_start = %sysfunc(intnx(year, &start_date, -1, beg));
      %let p_end   = %sysfunc(intnx(year, &start_date, -1, end));
      %let period_start  = %sysfunc(putn(&p_start, date9.));
      %let period_end    = %sysfunc(putn(&p_end,   date9.));
    %end;
    %else %do;
      %let p_start = %sysfunc(intnx(year, &start_date,  0, beg));
      %let p_end   = %sysfunc(intnx(year, &start_date,  0, end));
      %let period_start  = %sysfunc(putn(&p_start, date9.));
      %let period_end    = %sysfunc(putn(&p_end,   date9.));
    %end;
    %mend set_dates;
    

    Que você pode usar assim:

    %set_dates(year=2025,period=PREV);
    %put &=start_date %put &=p_start &=p_end &=period_start &=period_end;
    
    • 0

relate perguntas

  • Você pode usar uma QUERY no Planilhas Google usando a lógica OR e a fórmula =today() para uma data dinâmica no passado?

  • power bi - calcula a partir de 2 tabelas, com comparação de datas ao mesmo tempo

  • É possível arredondar para uma data arbitrária no Planilhas Google?

  • Planilha Google: preencher automaticamente a tabela com vários valores de células diferentes associados à data mais recente em outra tabela usando fórmulas

  • valores de data da planilha do Google atualizados com a nova localidade

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle?

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Quando devo usar um std::inplace_vector em vez de um std::vector?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Martin Hope
    Aleksandr Dubinsky Por que a correspondência de padrões com o switch no InetAddress falha com 'não cobre todos os valores de entrada possíveis'? 2024-12-23 06:56:21 +0800 CST
  • Martin Hope
    Phillip Borge Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle? 2024-12-12 20:46:46 +0800 CST
  • Martin Hope
    Oodini Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores? 2024-12-12 06:27:11 +0800 CST
  • Martin Hope
    sleeptightAnsiC `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso? 2024-11-09 07:18:53 +0800 CST
  • Martin Hope
    The Mad Gamer Quando devo usar um std::inplace_vector em vez de um std::vector? 2024-10-29 23:01:00 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST
  • Martin Hope
    MarkB Por que o GCC gera código que executa condicionalmente uma implementação SIMD? 2024-02-17 06:17:14 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve