0
votes

SAS CATS Fonction des périodes de retour au lieu de chiffres

Je tente de concaténer deux champs. Je veux montrer le mois et l'année à partir d'une date.

Les deux fonctions renvoient correctement les résultats lorsqu'ils sont utilisés séparés à l'extérieur de la fonction CATS.

Exemple: 2/14/2019

mois (app.submitedon) retourne 2 >

Année (app.submitedon) renvoie 2019

mais quand j'essaie de les concaténer ensemble comme ci-dessous, il revient ./. et non 2/2019.

chats (mois (app.submitedon), '/', année (app.subceton)) comme mois_year

pensées?

Code complet est: xxx


5 commentaires

Il n'y a pas d'alias de table nommé app dans votre requête SQL, je suppose que vous avez commis une erreur lors de l'affichage du code.


C'est probablement le problème, montrez le journal s'il vous plaît. Les chats () feront des conversions automatiques autrement.


Excuses. Vous êtes correct et j'ai mis à jour le message. La seule partie du journal relatif à ces champs est; Remarque: argument invalide pour la fonction de fonction. Les valeurs manquantes peuvent être générées. Remarque: argument invalide à la fonction de fonction. Les valeurs manquantes peuvent être générées.


Sans savoir que je suppose que c'est une des deux choses. 1) Il pourrait s'agir d'une typographie: triple vérifie que les noms de variable de la table correspondent au code (assurez-vous de rechercher des noms de variable et non des étiquettes variables). 2) La table source contient des valeurs manquantes. Ouvrez la table source et assurez-vous qu'il contient réellement les valeurs que vous attendez.


Maintenant, il n'y a pas d'alias de compteur de la variable nommée comte.app_id .


4 Réponses :


0
votes

Fonctions de mois et année Retour Int

Vous avez besoin de char xxx

ou d'utilisation format Monyy. Pour changer votre affichage de la date en année de mois.


8 commentaires

Les chats () sont censés faire une conversion automatique en fonction du meilleur format et de la documentation. Si l'élément est numérique, sa valeur est convertie en une chaîne de caractères à l'aide du bestw. format. Dans ce cas, SAS n'écrit pas une note au journal.


L'utilisation de ce qui précède produit toujours le ./. Chats (Met (mois (App.Submitedon), Z2.), '/', Met (Année (App.Submit Tedon), Z2.)) Comme mois_year


Je séparais le mois et l'année dernière au lieu d'utiliser la fonction de format ci-dessous car j'ai une matrice de table qui montre le dernier jour de chaque mois. Je concéderais alors que dans la formule ci-dessus. Idéalement, je veux transformer la date 2/14/2019 au 2/28/2019. Ou 3/05/2019 au 3/31/2019.


@ user1590497 Poster cela comme un commentaire car il ne faisait pas partie de la question initiale. Mais pour trouver le dernier jour d'un mois donné, vous pouvez simplement utiliser la fonction intnx () . Jetez un coup d'œil à cette question sur: Stackoverflow.com/a/11211180/214994 . Dans votre cas, vous feriez quelque chose comme: last_day_of_month = innx ('mois', votre_date_value, 0, 'fin');


@RobertPenridge. J'avais déjà essayé que, mais je ne recevais pas les résultats que je cherchais (juste retourné vide), j'ai donc changé mon approche de ce qui est dans ce post. Lorsque vous utilisez ce qui précède une valeur vide est renvoyé. Lors de la recherche de ma table via la procédure de contenu, il indique que ce champ est en nombre de numéro de numéro dans DateTime25.6.


@ user1590497 ahh ok. Donc, le problème est que votre champ est une valeur DateTime , pas une date de la valeur . Vous devez envelopper la variable avec la fonction datePart () avant d'essayer d'appliquer le mois mois () ou année () fonctionner et Cela devrait fonctionner bien.


@RobertPenridge merci monsieur! J'ai frappé ma tête sur ça pour toujours! Pour S & GS j'ai tenté d'utiliser cela avec la fonction INTNX, elle renvoie une valeur étrange maintenant, ce qui n'est pas au format de date du tout. Pensées?


@ user1590497 Les valeurs de date dans SAS ne sont que stockées comme des valeurs numériques (spécifiquement, le nombre de jours depuis 1/1/1960). Donc, une valeur numérique de 1 en SAS, lorsqu'elle est formatée avec un format de date indiquerait le 2 no janvier 1960. E.G. Data _Null_; x = 1; mettre x date9.; courir; . Donc, ne faites pas l'erreur de confondre l'apparence formatée d'une date, comme valeur réelle. Si vous regardez la date d'aujourd'hui en SAS (18/01/2019), la valeur numérique réelle stockée dans la variable est de 21714. E.G. Data _Null_; x = date (); mettre x; courir; . Il semble donc que vous ayez simplement besoin de formater votre variable pour le voir comme une date.



0
votes

Vous pouvez tirer parti du fait qu'il s'agit d'une date SAS et d'utiliser cela. XXX

EDIT: modifié pour traiter une variable de temps de données.


0 commentaires

0
votes

Cette combinaison de fonctions est correcte. Vous avez autre chose que cela ne se passe pas dans votre question:

Créer quelques données d'échantillons: P>

proc sql ;
  create table counts as
  select date,
         month(date) as month,
         year(date) as year,
         cats(month(date),'/',year(date)) as month_year1,
         put(date,yymms7.) as month_year2
         put(date,yymmn6.) as month_year3
  from have
  ;
quit;


0 commentaires

0
votes

La fonction CATS () utilisera le caractère attribué à l'option code> manquant code> pour les valeurs numériques manquantes. Vous pouvez modifier l'option manquante dans un espace plutôt que les périodes n'apparaîtront pas.

Mais de commentaires sur certaines des autres réponses, il semble que votre problème réel est que vous traitez avec une variable DateTime et non une variable de date . SAS stocke les valeurs de date comme nombre de jours depuis 1960 et les valeurs DateTime comme nombre de secondes. Les fonctions telles que mois () et année () ne fonctionneront pas à droite lorsqu'elles donnaient un numéro en quelques secondes au lieu de jours. P>

Il n'est pas nécessaire de tirer le mois et les collez-les ainsi que SAS a des formats qui retourneront cette chaîne pour vous. Par exemple, vous voudrez peut-être utiliser le format code> monyy code> (ou dtmonyy code> pour les valeurs DateTime). p> xxx pré>

Notez que vous voudrez peut-être utiliser un format d'une année avant le mois afin que les valeurs de votre nouvelle variable de caractères trieront correctement. P>

create table COUNTS AS
select substr(put(datepart(submittedon),yymmdds10.),1,7) as month_year
     , count( distinct APP_ID) AS COUNT
from APP
GROUP BY MONTH_YEAR
;


0 commentaires