sql >> Databasteknik >  >> RDS >> Sqlserver

Hur man anger den invarianta kulturen när man använder FORMAT() i SQL Server

I SQL Server kan du använda FORMAT() funktion för att formatera datum/tid och siffervärden som strängar. I synnerhet ger funktionen "lokalmedveten" formatering, och funktionen accepterar ett "kultur"-argument, som låter dig ange en kultur eller ett språk som ska användas för det faktiska formatet. Du kan till exempel skicka en-us för att säkerställa att resultaten är formaterade i amerikanskt engelska format.

Kulturargumentet är valfritt, så om du inte tillhandahåller det kommer resultatet att avgöras av språket för den aktuella sessionen.

FORMAT() funktion accepterar alla kulturer som stöds av .NET Framework som argument (du är inte begränsad till de språk som uttryckligen stöds av SQL Server).

En av de kulturer som stöds av .NET Framework är den invarianta kulturen. Den invarianta kulturen är kulturokänslig. Mer specifikt är denna kultur förknippad med det engelska språket men inte med något land/region.

För att ange att FORMAT() ska mata ut resultaten med den invarianta kulturen, använd bara "iv" för kulturargumentet (det tredje argumentet).

Exempel 1 – Valuta

Här är ett exempel på att formatera ett värde som en valuta med den invarianta kulturen.

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

Resultat:

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

Detta resulterar i att utgången har en bråkdel med en decimal. Den är också inlagd med valutatecknet (¤), som används för att beteckna en ospecificerad valuta (detta är Unicode-tecknet U+00A4).

Exempel 2 – Datum

Här är ett exempel på att formatera ett datum med den invarianta kulturen tillsammans med ett kort datumformat.

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

Resultat:

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

Det korta datumformatet för den invarianta kulturen är MM/dd/åååå.

Här är den igen, men den här gången jämför jag den med USA:s engelska, brittiska och tyska (tyska) 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)';

Resultat:

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

Exempel 3 – Alla standardformat för datum och tid

Här är en annan som använder den invarianta kulturen, men den här gången formaterar jag en datetime offset värde med alla standardsträngar för datum- och tidsformat som stöds av .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 (med vertikal utdata):

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 invarianta kulturen fungerar inte på ditt system?

Om du inte kan få den invarianta kulturen att fungera på ditt system kan det bero på att en äldre version av .NET Framework har installerats. Dokumentationen för .NET Framework 4.8 anger uttryckligen att den invarianta kulturen är tillgänglig med dess ISO 639-1 tvåbokstavskod "iv" .

Men på den här Stack Overflow-frågan antyder svaret från Solomon Rutzky att detta bara kan ha varit tillgängligt från .NET 4.5.

Om du inte kan få det att fungera med en tidigare version av .NET, prova att uppgradera till den senaste versionen (eller en version från minst 4.5).


  1. SQL Server 2016:View Designer

  2. Hur får man information om en användardefinierad typ?

  3. Mapping array med Hibernate

  4. Hur kan jag ta bort dubbletter av rader i en tabell