2010-07-05 7 views
3

Il existe un champ de texte appelé myDate. Ce champ peut contenir 1) 'Exercice se terminant par someDate' ou 2) 'dateA à' dateB '.SQL: extrait la date de la chaîne

Dans la situation 1), je veux définir le champ date1 = à someDate.

Dans la situation 2), je veux définir le champ date1 = dateA et le champ date2 = dateB.

Toutes les dates (someDate, dateA, dateB) peuvent être écrits comme 1/1/2000, 1 Janvier 2000, ou 1 Janvier 2000.

Comment puis-je aller sur les extraire les dates de myDate et les insérer dans les champs corrects?

+3

C'est une conception horrible. Si c'est même une option vague, vous devez sauvegarder comment vous gérez les dates et les plages de dates. – Donnie

+2

@donnie C'est vraiment une chose horrible à faire, mais malheureusement, j'ai souvent dû faire des choses comme ça, surtout lors de la conversion de vieilles feuilles de calcul et de Dieu-sait-quoi dans un système approprié. Peut-être que @dmr ne fait pas face à une mauvaise conception, en tant que telle? Je suis sûr qu'il nous le dira :) –

+0

Merci pour votre défense @Matt. Comme vous l'avez dit, j'essaie d'importer des données d'un ancien système dans un nouveau système correctement conçu. – dmr

Répondre

4

Cela ne semble pas assez compliqué pour avoir besoin d'une expression régulière "correcte". Ces dates textuelles peuvent être analysées directement dans un type DATETIME par SQL sans bidouiller, comme vous pouvez le voir en exécutant cette requête:

SELECT CAST('1/1/2000' AS DATETIME), CAST('January 1, 2000' AS DATETIME), CAST('Jan 1, 2000' AS DATETIME) 

Pour obtenir -1 années et 1 jour, il suffit d'utiliser DATEADD, par exemple

SELECT DATEADD(dd, 1, DATEADD(yy, -1, 'January 1 2000')) 

... tout ce que vous avez vraiment besoin de faire est de faire face à vos deux cas différents et de saisir les dates. Donc, quelque chose comme:

SELECT 
    CASE 
    WHEN myDate LIKE 'fiscal year ending %' THEN CAST(DATEADD(dd, 1, DATEADD(yy, -1, REPLACE(myDate, 'fiscal year ending ', ''))) AS DATETIME) 
    ELSE CAST(LEFT(myDate, PATINDEX('% to %', myDate)) AS DATETIME) 
    END 'FromDate', 
    CASE 
    WHEN myDate LIKE 'fiscal year ending %' THEN CAST(REPLACE(myDate, 'fiscal year ending ', '') AS DATETIME) 
    ELSE CAST(SUBSTRING(myDate, PATINDEX('% to %', myDate) + 4, 100) AS DATETIME) 
    END 'ToDate' 
FROM 
    ...whatever 

... devrait faire l'affaire. Je n'ai pas vraiment testé cela, mais j'espère que ça vous donnera assez d'idée pour voir ce que je veux dire.

Notez que certains des résultats dépendront probablement des paramètres de langue de votre serveur/base de données. Par exemple, alors que 1/1/2000 va toujours être le 1er janvier, le 3/4/2000 est-il le 3 avril ou le 4 mars?