sql >> Database teknologi >  >> RDS >> Sqlserver

Sådan angives den invariante kultur, når du bruger FORMAT() i SQL Server

I SQL Server kan du bruge FORMAT() funktion til at formatere dato/klokkeslæt og talværdier som strenge. Funktionen giver især "lokale-bevidst" formatering, og funktionen accepterer et "kultur"-argument, som giver dig mulighed for at angive en kultur eller et sprog, der skal bruges til det faktiske format. For eksempel kan du sende en-us for at sikre, at resultaterne er formateret i amerikansk engelsk format.

Kulturargumentet er valgfrit, så hvis du ikke angiver det, vil outputtet blive bestemt af sproget for den aktuelle session.

FORMAT() funktion accepterer enhver kultur, der understøttes af .NET Framework som et argument (du er ikke begrænset til de sprog, der eksplicit understøttes af SQL Server).

En af de kulturer, der understøttes af .NET Framework, er den invariante kultur. Den invariante kultur er kulturufølsom. Mere specifikt er denne kultur forbundet med det engelske sprog, men ikke med noget land/område.

For at angive den FORMAT() skal udlæse resultaterne ved hjælp af den invariante kultur, skal du blot bruge "iv" for kulturargumentet (det tredje argument).

Eksempel 1 – Valuta

Her er et eksempel på formatering af en værdi som en valuta ved hjælp af den invariante kultur.

SELECT FORMAT(123, 'C', 'iv') Result;

Resultater:

+----------+
| Result   |
|----------|
| ¤123.00  |
+----------+

Dette resulterer i, at output har en brøkdel med en decimal. Det er også sat foran med valutategnet (¤), som bruges til at angive en uspecificeret valuta (dette er Unicode-tegnet U+00A4).

Eksempel 2 – Dato

Her er et eksempel på formatering af en dato ved hjælp af den invariante kultur sammen med et kort datoformat.

DECLARE @date date = '2030-05-25';
SELECT FORMAT(@date, 'd', 'iv') Result;

Resultater:

+------------+
| Result     |
|------------|
| 05/25/2030 |
+------------+

Det korte datoformat for den invariante kultur er MM/dd/åååå.

Her er det igen, men denne gang sammenligner jeg det med de amerikanske engelske, britiske og tyske (tysk) kulturer.

DECLARE @date date = '2030-05-25';
SELECT 
  FORMAT(@date, 'd', 'iv') 'Invariant Culture',
  FORMAT(@date, 'd', 'en-us') 'US English',
  FORMAT(@date, 'd', 'en-gb') 'British',
  FORMAT(@date, 'd', 'de-de') 'German (Deutsch)';

Resultater:

+---------------------+--------------+------------+--------------------+
| Invariant Culture   | US English   | British    | German (Deutsch)   |
|---------------------+--------------+------------+--------------------|
| 05/25/2030          | 5/25/2030    | 25/05/2030 | 25.05.2030         |
+---------------------+--------------+------------+--------------------+

Eksempel 3 – Alle standard dato- og tidsformater

Her er endnu en, der bruger den invariante kultur, men denne gang formaterer jeg en dato-tidsforskydning værdi ved hjælp af alle standard dato- og tidsformatstrenge, der understøttes af .NET Framework.

DECLARE @date datetimeoffset, @culture char(2); 
SET @date = '2030-05-25 23:59:30.1234567 +07:00';
SET @culture = 'iv';
SELECT 
  FORMAT(@date, 'd', @culture) AS 'd',
  FORMAT(@date, 'D', @culture) AS 'D',
  FORMAT(@date, 'f', @culture) AS 'f',
  FORMAT(@date, 'F', @culture) AS 'F',
  FORMAT(@date, 'g', @culture) AS 'g',
  FORMAT(@date, 'G', @culture) AS 'G',
  FORMAT(@date, 'm', @culture) AS 'm',
  FORMAT(@date, 'M', @culture) AS 'M',
  FORMAT(@date, 'o', @culture) AS 'o',
  FORMAT(@date, 'O', @culture) AS 'O',
  FORMAT(@date, 'r', @culture) AS 'r',
  FORMAT(@date, 'R', @culture) AS 'R',
  FORMAT(@date, 's', @culture) AS 's',
  FORMAT(@date, 't', @culture) AS 't',
  FORMAT(@date, 'T', @culture) AS 'T',
  FORMAT(@date, 'u', @culture) AS 'u',
  FORMAT(@date, 'U', @culture) AS 'U',
  FORMAT(@date, 'y', @culture) AS 'y',
  FORMAT(@date, 'Y', @culture) AS 'Y';

Resultat (ved hjælp af lodret output):

d | 05/25/2030
D | Saturday, 25 May 2030
f | Saturday, 25 May 2030 23:59
F | Saturday, 25 May 2030 23:59:30
g | 05/25/2030 23:59
G | 05/25/2030 23:59:30
m | May 25
M | May 25
o | 2030-05-25T23:59:30.1234567+07:00
O | 2030-05-25T23:59:30.1234567+07:00
r | Sat, 25 May 2030 16:59:30 GMT
R | Sat, 25 May 2030 16:59:30 GMT
s | 2030-05-25T23:59:30
t | 23:59
T | 23:59:30
u | 2030-05-25 16:59:30Z
U | NULL
y | 2030 May
Y | 2030 May

Den invariante kultur virker ikke på dit system?

Hvis du ikke er i stand til at få den invariante kultur til at virke på dit system, kan det skyldes, at en ældre version af .NET Framework er installeret. Dokumentationen til .NET Framework 4.8 angiver eksplicit, at den invariante kultur er tilgængelig ved brug af dens ISO 639-1 tobogstavskode "iv" .

Men på dette Stack Overflow-spørgsmål antyder svaret fra Solomon Rutzky, at dette muligvis kun har været tilgængeligt fra .NET 4.5.

Hvis du ikke kan få det til at fungere med en tidligere version af .NET, så prøv at opgradere til den nyeste version (eller en version fra mindst 4.5).


  1. Liste og skifte databaser i PostgreSQL

  2. Bruger jeg JDBC Connection Pooling?

  3. Hvordan erstatter man et regulært udtryk i MySQL?

  4. Parsing tnsnames.ora i Visual C# 2008