2017-01-03 5 views
0

J'essaie de résoudre une requête qui est apparue dans SSRS après la nouvelle année. Nous avons une entrée qui provient d'une autre application. Il saisit une date et la stocke comme varchar. Le rapport de SSRS va chercher alors la « dates » top 100 mais quand 2017 dates sont venus autour, ce ne sont pas dans le top 100.Cast varchar en tant que date sélectionnez top 100

La requête actuelle se lit comme suit

SELECT DISTINCT TOP (100) 
FROM DenverTempData 
ORDER by BY Date DESC 

La date est stockée sous forme VARCHAR . Donc, évidemment, cette requête n'attrape pas une valeur comme 01012017 comme étant un top 100 (plus de valeurs aime 12312016). J'ai pensé que peut-être je peux simplement changer le type de données sur cette colonne à datetime. Mais l'information provient d'un fichier plat et est convertie, donc c'est un peu plus difficile que ça. J'espère donc faire une sélection du top 100 distinct tout en convertissant la colonne de date en datetime ou tout simplement en date et en saisissant les 100 dernières dates.

Quelqu'un peut-il aider avec la syntaxe de la requête? Je pense à un casting pour convertir varchar en date, mais comment puis-je formater avec top 100 distinct? Je cherche simplement à récupérer les 100 dernières dates dans l'ordre chronologique d'une colonne qui est stockée comme varchar mais contient une chaîne représentant un date.

Espérons que logique

+0

Demandez-vous comment changer la valeur au format de date comme «MM/jj/aaaa»? – LONG

+0

Je demande comment formater une requête de sélection sur une colonne varchar tout en la convertissant en un type de données date et en sélectionnant le top 100. –

Répondre

1

Il est toujours une mauvaise idée de stocker une date sous forme de chaîne. C'est très spécifique à la culture!

Vous pouvez lancer votre chaîne de date formatée à une date réelle comme ceci:

DECLARE @DateMMDDYYYY VARCHAR(100)='12312016'; 

SELECT CONVERT(DATE,STUFF(STUFF(@DateMMDDYYYY,5,0,'-'),3,0,'-'),110) 

Après la conversion de votre tri (et donc le TOP 100) devrait fonctionner comme prévu.

Mon conseil fort: Essayez de stocker vos dates dans une colonne d'un type de date réel pour éviter un tel hassel!

0
SELECT DISTINCT TOP 100 (CAST(VarcharColumn as Date) as DateColumn) 
FROM TABLE 
Order by DateColumn desc 
+0

Vérifiez si cela fonctionne ou non – LONG

+0

en utilisant SELECT DISTINCT TOP 100 (CAST (Date comme date)) DATE FROM DenverTempData ORDER BY La commande desc renvoie l'erreur suivante "la conversion a échoué lors de la conversion de la date et/ou de l'heure de la chaîne de caractères" –

+0

@LONG, Il n'y a pas de conversion directe depuis "12312016". Vous pouvez lancer une chaîne de format '20161231' (aussi appelée * non séparée *), mais la chaîne donnée est' mmddyyyy' ... Ceci ne sera pas castable directement. Même avec les séparateurs appropriés «12-31-2016», un cast (ou un simple «CONVERT») dépendrait des paramètres de culture du système ... Dans ce cas, vous devriez toujours appeler «CONVERT» avec le code de format approprié. éviter les problèmes interculturels ... – Shnugo