2016-08-26 2 views
0

Je fais un rapport qui montre les anniversaires des départements pour le mois en cours, et pour une raison quelconque, ils ont décidé d'utiliser VARCHAR (10) pour l'anniversaire de l'employé en la table. Bien que, je peux obtenir l'information dont j'ai besoin en utilisant VARCHAR, je suis incapable de filtrer le mois courant dans Tableau parce qu'il ne reconnaît pas les données comme une date réelle.Besoin de convertir VARCHAR (10) en utilisant la chaîne MMMDD dans une DATE en SQL

J'ai donc besoin de convertir VARCHAR (10) en utilisant une chaîne MMMDD dans une DATE en SQL. Je sais que sans l'année, ce ne sera jamais une date valide, mais l'année n'est pas importante pour mon rapport, donc une année générique peut être appliquée.

Toute aide serait géniale. PeopleSoftData.birth_date est le champ qui est VARCHAR (10) et la chaîne de données utilise MMMDD Ex: JAN18 sans un an, donc j'ai eu des problèmes pour convertir en DATE en utilisant Q & A préexistant sur le site.

SELECT 
    PeopleSoftData.fname+' '+PeopleSoftData.lname AS 'Full Name', 
    PeopleSoftData.fname AS 'First Name', 
    PeopleSoftData.lname AS 'Last Name', 
    PeopleSoftData.location AS 'Site', 
    PeopleSoftData.birth_date AS 'Birth Date', -- This field is VARCHAR(10) and the data string is using MMMDD Ex:JAN18 without a year 
    PeopleSoftData.orig_hire_date AS 'Hire Date', 
    PeopleSoftData.supervisor_name AS 'Supervisor' 

FROM dbo.USC_StatsApp_Members MemberList 
    INNER JOIN dbo.USC_Reporting_PeopleSoft_Data PeopleSoftData ON (PeopleSoftData.empcontid = MemberList.empcontid) 

WHERE 
    PeopleSoftData.termination_date IS NULL 
    AND PeopleSoftData.birth_date IS NOT NULL 
    AND MemberList.USC_Active = 1 
    AND DATEDIFF(wk,MemberList.Last_seen_PeopleSoft,current_timestamp) < 2 
+1

Ne pas oublier d'avoir une année bissextile comme générique an. – jarlh

+0

Pourquoi avez-vous même besoin de le lancer comme une date? Essaies-tu simplement de changer le format d'affichage? – shawnt00

+0

pour exécuter des fonctions de date sur elle .... –

Répondre

1

Peut-être que cela peut aider

select cast(concat('JAN18',' ',year(getdate())) as date) 

Retours 2016-01-18

+0

Merci, cela m'a eu ce que j'avais besoin d'utiliser: CAST (CONCAT (PeopleSoftData.birth_date, '', année (getdate())) comme date) AS 'Date de naissance', –

+4

Ne fonctionnera pas l'année prochaine (2017), pour FEB29 . Stick aux années bissextiles, – jarlh

+0

@jarlh Vous avez absolument raison, l'année par défaut devrait être une année bissextile.J'ai vu votre commentaire et aurait dû le souligner aussi –

0

juste concaténer année en cours au début de celui-ci et de le jeter à une date

SELECT 
    p.fname+' '+PeopleSoftData.lname AS 'Full Name', 
    p.fname AS 'First Name', 
    p.lname AS 'Last Name', 
    p.location AS 'Site', 
    cast(datename(year, getdate()) + p.birth_date as date) AS 'Birth Date', 
    p.orig_hire_date AS 'Hire Date', 
    p.supervisor_name AS 'Supervisor' 

FROM dbo.USC_StatsApp_Members m 
    JOIN dbo.USC_Reporting_PeopleSoft_Data p 
    ON p.empcontid = m.empcontid 

WHERE p.termination_date IS NULL 
    AND p.birth_date IS NOT NULL 
    AND m.USC_Active = 1 
    AND DATEDIFF(wk, m.Last_seen_PeopleSoft, current_timestamp) < 2 

pour éliminer les erreurs que vous pouvez tester en premier ...

SELECT 
    p.fname+' '+PeopleSoftData.lname AS 'Full Name', 
    p.fname AS 'First Name', 
    p.lname AS 'Last Name', 
    p.location AS 'Site', 
    case When isDate(datename(year, getdate()) + p.birth_date) = 1 
     then cast(datename(year, getdate()) + p.birth_date as date) 
     else null end AS 'Birth Date', 
    p.orig_hire_date AS 'Hire Date', 
    p.supervisor_name AS 'Supervisor' 

FROM dbo.USC_StatsApp_Members m 
    JOIN dbo.USC_Reporting_PeopleSoft_Data p 
    ON p.empcontid = m.empcontid 

WHERE p.termination_date IS NULL 
    AND p.birth_date IS NOT NULL 
    AND m.USC_Active = 1 
    AND DATEDIFF(wk, m.Last_seen_PeopleSoft, current_timestamp) < 2 
+0

Cela fonctionnerait pour MMMYY mais l'entrée est MMMDD –

+0

oh, raté cela. Alors, duh, concaténer * l'année en cours * ... Je vais éditer ma réponse. –

0

Une façon ('FEB29' => « 29FEB2016 => DATETIME):

select cast(right(birth_date, 2) + left(birth_date, 3) + '2016' as date) 

2016-02-29

+0

Merci. Depuis 2016 est une année bissextile, cela fonctionnerait pour le garder en échec! Apprendre beaucoup de choses! Je suis un novice SQL, lol. –