web-dev-qa-db-fra.com

Sql Server Date Format JJ-Lun-YY

Nous travaillons à la migration de notre application d'Oracle 11 vers SQL Server 2014. Il existe de nombreux endroits dans notre code Java qui attendent la date au format DD-Mon-YY. Je ne pouvais pas trouver une option avec convert ou toute autre fonction intégrée permettant de le faire sans insérer "-" dans la chaîne convertie. 

Aujourd'hui, nous utilisons quelque chose comme 

upper((((CONVERT(NVARCHAR, Dt_Column, 113), 3, 1, '-'), 7, 3, '-'),1,18))

Nous l'utilisons pour plusieurs colonnes dans la même vue qui charge quelques centaines de milliers de lignes, ce qui, à mon avis, pourrait affecter nos performances. Toutes les contributions/pensées seront utiles. Merci d'avance.

4
rsreji

Cela permettra d'atteindre l'effet souhaité:

SELECT REPLACE(CONVERT(NVARCHAR, Dt_Column, 106), ' ', '-')

Style 106 pour CONVERT fournit la date au format dd mon yyyy, que vous pouvez ensuite simplement remplacer par un tiret.

Mise à jour

Sur la base des informations supplémentaires que le format doit également inclure l'heure, vous pouvez essayer d'utiliser FORMAT:

SELECT FORMAT(SYSDATETIME(), 'dd-MMM-yyyy hh:mm:ss')

Une chose à garder à l'esprit est que FORMAT s'appuie sur le CLR. Vous devez donc évaluer l'impact sur les performances. Cependant, avec votre jeu de données, un seul appel à FORMAT pourrait être équivalent ou donner de meilleurs résultats que plusieurs appels de fonctions natives.

Dans les deux cas, si vous trouvez que l’obtention de la date au format correct est trop importante, vous pouvez utiliser une colonne calculée persistante dans SQL Server pour conserver la date formatée. Si vous ne souhaitez pas renommer la référence de colonne dans votre code Java, vous pouvez renommer la colonne source et nommer la nouvelle colonne calculée le nom d'origine de la colonne source.

Voir https://docs.Microsoft.com/en-us/sql/t-sql/statements/alter-table-computed-column-definition-transact-sql .

[PERSISTED] stockera physiquement les valeurs calculées dans la table et les mettra à jour lorsque toutes les autres colonnes dont dépend la colonne calculée sont mises à jour

6
Joey

Utilisez la réponse de Joey comme point de départ et combinez-la avec les informations de la sectionstyles de date et heure} _ de la section docs.Microsoft.com CAST et CONVERT (Transact-SQL) page, la commande CONVERT (NVARCHAR, @Value, 6) émet l’année à deux chiffres que vous recherchez.

DECLARE     @Now AS DATETIME = GETDATE()

SELECT          @Now AS '@Now'
            ,   REPLACE(CONVERT(NVARCHAR, @Now, 6), ' ', '-') AS 'Abbr@Now'

/***********************************************************************

    Results:

        @Now                    Abbr@Now
        ----------------------- ---------
        2017-12-22 10:08:33.443 22-Dec-17

        (1 row(s) affected)

 ***********************************************************************/

Un formatage DATETIME supplémentaire à l'aide de CONVERT () est disponible à l'adresse suivante: https://docs.Microsoft.com/en-us/sql/t-sql/functions/cast-and-convert-transact-sql

J'espère que c'était utile.

0
ClockEndGooner