Je cherche à convertir une entrée d'utilisateur qui sera une date nvarchar à une date britannique p>
L'entrée de l'utilisateur sera toujours un maximum de 6 chiffres. P>
Par exemple: P>
151119 (DDMMYY) -> 15nov19 P>
120119 (DDMMYY) -> 12JAN19 P>
3 Réponses :
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), ' ', ''));
Comme DATENNAME CODE> est dépendant de la langue, vous pouvez obtenir des surprises avec des dates telles que
150419 code> sous
définir la langue française code>. 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.)
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);
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 |
A cas simple serait applicable car une seule valeur est en cours de vérification et comme code> 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 code>.
Je laisserais le sinon code> complètement - l'expression résultante deviendra alors
null code>, 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).
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 code> et d'une poupée de
case ... quand "01" Alors "Jan '" quand "02'" Puis 'février' ... fin code>. En général, bien sûr, vous serez beaucoup mieux à utiliser des formats sans ambiguïtés tels que
AAAA-MM-DD CODE>, Stockage des dates comme
Date code> Colonnes et laissant la mise en forme du client.
@ Jeroenmostert -
datename code> et
format code> peut fournir des noms de mois
@Martinsmith: J'ai pensé au format code> code> juste après que je l'ai dit mais je n'ai jamais utilisé
datename code>. (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 code> colonnes. Pendant que vous pouvez convertir la chaîne en une date code> code> ((via l'application appropriée de
Stuff code> et
Convert code>), puis
format code> C'est encore plus maladroit et rond-point que de simplement faire une sous-chaîne et
case code> 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')) Code> Regardez-vous? Il a l'air horrible pour moi.
NE PAS i> 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 code> qui change d'avenir. Si vous Google pour
15 novembre 1919 CODE> 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 code> Tapez SQL Server utilise 3 octets.