0
votes

Convertir une nvarchar en une date britannique

Je cherche à convertir une entrée d'utilisateur qui sera une date nvarchar à une date britannique

L'entrée de l'utilisateur sera toujours un maximum de 6 chiffres.

Par exemple:

151119 (DDMMYY) -> 15nov19

120119 (DDMMYY) -> 12JAN19


7 commentaires

Pas difficile, mais fastidieux. Il n'y a rien de construit dans T-SQL qui vous donnera des noms de mois, vous avez donc besoin de sous-chaîne et d'une poupée de case ... quand "01" Alors "Jan '" quand "02'" Puis 'février' ... fin . En général, bien sûr, vous serez beaucoup mieux à utiliser des formats sans ambiguïtés tels que AAAA-MM-DD , Stockage des dates comme Date Colonnes et laissant la mise en forme du client.


@ Jeroenmostert - datename et format peut fournir des noms de mois


@Martinsmith: J'ai pensé au format juste après que je l'ai dit mais je n'ai jamais utilisé datename . (Et compte tenu de sa production spécifique à la culture, maintenant que je le sais, je ne le ferai jamais. Mais bon, c'est quelque chose.)


@ Jeroenmostert j'ai essayé d'utiliser le format mais qui ne fonctionnera pas avec une nvarchar


Oui, c'est pourquoi vous voulez vraiment stocker des dates dans date colonnes. Pendant que vous pouvez convertir la chaîne en une date ((via l'application appropriée de Stuff et Convert ), puis format C'est encore plus maladroit et rond-point que de simplement faire une sous-chaîne et case danse. Il y a aussi la question de deux années à deux chiffres étant ambiguës. Est-ce que sélectionne haut (format (convert) (Stuff ('151119', 3, 0, '-'), 6, 0, '-'), 5), 'DDMMYYY', 'EN-GB')) Regardez-vous? Il a l'air horrible pour moi.


NE PAS Autoriser une telle entrée de commencer. En quelle année est 19 quand même? Toutes les plateformes d'interface utilisateur ont des pickers de la date, toutes les langues prennent en charge les types de date. Même si vous dites coup de coupure qui change d'avenir. Si vous Google pour 15 novembre 1919 Vous constaterez que de nombreux sites stockent de telles dates et peuvent vous dire que l'armée rouge a capturé OMSK au 14 novembre 1919


BTW La date Tapez SQL Server utilise 3 octets.


3 Réponses :


2
votes

Vous avez besoin d'un date code> ou DateTime code> / DateTime2 code> la valeur en premier. Vous pouvez obtenir cette valeur à l'aide de cette référence Sélectionnez CODE> Tery avec Convert code>:

-- set the date value (from custom date value).
DECLARE @dDateValue AS DATE = CONVERT(DATE, 
  SUBSTRING('150419', 3, 2) + '-'
  + SUBSTRING('150419', 1, 2) + '-'
  + SUBSTRING('150419', 5, 2)
, 10);

-- format the date value to the expected format.
SELECT UPPER(REPLACE(CONVERT(VARCHAR, @dDateValue, 6), ' ', ''));


1 commentaires

Comme DATENNAME est dépendant de la langue, vous pouvez obtenir des surprises avec des dates telles que 150419 sous définir la langue française . Bien sûr, obtenir une date spécifique à la langue peut être exactement ce que vous voulez, en fonction du cas d'utilisation. (Il peut y avoir des langues dans lesquelles le nom de trois lettres pour le mois n'est pas les trois premières lettres du nom du mois, cela ne fonctionnerait donc pas en premier lieu, même si je ne sais pas s'il y en a.)



2
votes

Vous devez modifier la chaîne dans quelque chose qui ressemble même à un format de date normal, vous pouvez utiliser Convert:

declare @textDate nvarchar(6) = '120119';

select @textDate
    , stuff(stuff(@textDate, 3,0,'/'), 6,0,'/')
    , convert(date, stuff(stuff(@textDate, 3,0,'/'), 6,0,'/'), 3);


0 commentaires

1
votes

Je recommande fortement de travailler avec les valeurs de date sur les colonnes à titre de date ou de type DateTime. Il s'agit d'une implémentation simple pour votre besoin:

SQL Fiddle P>

MS SQL Server 2017 Schema Setup STRY>: P>

|             |
|-------------|
| 15/11/2019  |
| 12/01/2019  |


2 commentaires

A cas simple serait applicable car une seule valeur est en cours de vérification et comme n'est pas nécessaire: Substrage de boîtier (mydate, 3, 2) lorsque" 01 "Alors ' Jan 'Quand' 02 'Alors' février '... d'autre' Merci de jouer! ' fin .


Je laisserais le sinon complètement - l'expression résultante deviendra alors null , qui est très visible et, espérons-le, facile à diagnostiquer (par opposition à la chaîne devenant potentiellement devenant trop long, ou pire, étant accepté silencieusement avec l'erreur "Erreur" là-bas).