下面的宏关于日期(月份)在做什么。是否将时间段设置为一个月,每次设置为哪个月?

时间:2019-03-27 14:30:42

标签: date macros sas

我正在使用静态日期计算行数(例如datefield> = 01/02/2019和datefield <= 28/02/2019),我得到x行数。我的报告是每月运行一次

由其他人开发的自动报告定义时间段(应为一个月),并使用下面的宏定义时间段。在同一时间段内,报告给出的行数为y。

有人可以用简单的英语解释下面的宏吗(不用说我的sas和proc sql技能非常有限)

我假设它选择的时间可能超过一个月,因此我计算行数时的数字差异

/*%macro (today = );*/
option MPRINT MLOGIC symbolgen;

data _null_;
M_month =  month(&today);
if M_month in (1 2 3 4 5 6) then
        call symput('M_StartDate', put(intnx('month', &today ,-2-M_month,'beginning'), date9.));
else
        call symput('M_StartDate', put(intnx('month', &today ,4-M_month,'beginning'), date9.));


if M_month in ( 5 6)then
        call symput('M_EndDate', put(intnx('month', &today ,3-M_month,'end'), date9.));
else  if  M_month in ( 11 12) then
        call symput('M_EndDate', put(intnx('month', &today ,9-M_month,'end'), date9.));
else
        call symput('M_EndDate', put(intnx('month', &today ,-1,'end'), date9.));


call symput('M_CuttOffDate', put(intnx('month', &today , -1,'end'), date9.));


 call symput('run_MMMYY', put(intnx('month', &today , 0,'end'), EURDFMY5.));


run;

2 个答案:

答案 0 :(得分:1)

最后两个很简单。 Cuttoff是上个月的最后一天。最后一个MMMYY就是该格式的当月月份。

对于其他两个,它正在根据一年中的月份调整更改日期的数量。

要弄清楚,您可能只想让自己成为一个小的真值表,该表每年一年一次,每行一列,用于不同的目标宏变量。因此,也许只需写下TODAY的月份,然后为新的宏变量生成哪个月份。

data _null_;
do m_month=1 to 12 ;
  today = mdy(m_month,1,2018);
  if M_month in (1 2 3 4 5 6) then M_StartDate = intnx('month', today ,-2-M_month,'b');
  else M_StartDate = intnx('month', &today ,4-M_month,'b');

  if M_month in ( 5 6)then M_EndDate = intnx('month', today ,3-M_month,'e');
  else if  M_month in ( 11 12) then M_EndDate = intnx('month', today ,9-M_month,'e');
  else M_EndDate = intnx('month', today ,-1,'end');

  put (today m_startdate m_enddate) (=yymmdd10.);
end;
run;

结果

today=2018-01-01 M_StartDate=2017-10-01 M_EndDate=2017-12-31
today=2018-02-01 M_StartDate=2017-10-01 M_EndDate=2018-01-31
today=2018-03-01 M_StartDate=2017-10-01 M_EndDate=2018-02-28
today=2018-04-01 M_StartDate=2017-10-01 M_EndDate=2018-03-31
today=2018-05-01 M_StartDate=2017-10-01 M_EndDate=2018-03-31
today=2018-06-01 M_StartDate=2017-10-01 M_EndDate=2018-03-31
today=2018-07-01 M_StartDate=2018-04-01 M_EndDate=2018-06-30
today=2018-08-01 M_StartDate=2018-03-01 M_EndDate=2018-07-31
today=2018-09-01 M_StartDate=2018-02-01 M_EndDate=2018-08-31
today=2018-10-01 M_StartDate=2018-01-01 M_EndDate=2018-09-30
today=2018-11-01 M_StartDate=2017-12-01 M_EndDate=2018-09-30
today=2018-12-01 M_StartDate=2017-11-01 M_EndDate=2018-09-30

答案 1 :(得分:0)

  1. 删除通话记录并创建变量。

    calc_price()

成为:

<?php
include("header.php");
?>
<script type="text/javascript">

function calc_price()
{
    alert('ooooooooooooooooooooooooooooo');
    var pro_qty=<?php echo($row['pro_qty']);?>;
    var price=document.getElementById('pro_price').value;
    var count=document.getElementById('pro_qty').value;
    var total_price;

    if(count>pro_qty)
        {alert('تعداد موجودی انبار کمتر از درخواست شماست');
         document.getElementById('pro_qty').value=0;
         count=0;
        }
    if(count==0 || count='') total_price=0;
    else total_price=count*price;

    document.getElementById('total_price').value=total_price;

}

</script>


<form action="action_order.php" method="post" name="order">
  <p> 
    <label for="textfield3">تعداد درخواستی</label>
    <input type="text" name="pro_qty" id="pro_qty" onChange="calc_price();">
  </p>
    <input type="submit" name="button" id="button" value="خرید محصول">
  </p>
</form>


<?php
include("footer.php");
?>
  1. 今天删除&today以使用变量代替
  2. 添加循环以循环浏览日期以查看不同的范围。

      render() {
         var sidebarpagedata = this.state.allServices.companies.map((sidebarpagedata, index) => {
             <Button type="button" className="default pull-right" onClick={this.addCompnay} >Apply Now</Button>
        })
    
        return (
            {sidebarpagedata}
        );
    
    }
    

然后,您可以检查输出,查看范围是什么,以及它们是否符合您的期望。它看起来是变化的动态范围。