sql >> Base de Datos >  >> RDS >> Sqlserver

Cómo especificar la cultura invariable cuando se usa FORMAT() en SQL Server

En SQL Server, puede usar FORMAT() función para dar formato a la fecha/hora y los valores numéricos como cadenas. En particular, la función proporciona un formato "consciente de la configuración regional", y la función acepta un argumento de "cultura", que le permite especificar una cultura o idioma para usar para el formato real. Por ejemplo, puede pasar en-us para asegurarse de que los resultados estén en formato de inglés estadounidense.

El argumento cultural es opcional, por lo que si no lo proporciona, la salida estará determinada por el idioma de la sesión actual.

El FORMAT() La función acepta cualquier referencia cultural admitida por .NET Framework como argumento (no está limitado a los idiomas admitidos explícitamente por SQL Server).

Una de las culturas compatibles con .NET Framework es la cultura invariable. La cultura invariable es insensible a la cultura. Más específicamente, esta cultura está asociada con el idioma inglés pero no con ningún país/región.

Para especificar que FORMAT() debe generar los resultados usando la cultura invariable, simplemente use "iv" para el argumento cultural (el tercer argumento).

Ejemplo 1:moneda

Este es un ejemplo de formato de un valor como una moneda utilizando la referencia cultural invariable.

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

Resultados:

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

Esto da como resultado que la salida tenga una parte fraccionaria con un lugar decimal. También va precedido del signo de moneda (¤), que se usa para indicar una moneda no especificada (este es el carácter Unicode U+00A4).

Ejemplo 2 – Fecha

Este es un ejemplo de cómo formatear una fecha usando la referencia cultural invariable junto con un formato de fecha corto.

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

Resultados:

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

El formato de fecha corta para la referencia cultural invariable es MM/dd/aaaa.

Aquí está de nuevo, pero esta vez lo comparo con las culturas inglesa, británica y alemana (Deutsch) de EE. UU.

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)';

Resultados:

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

Ejemplo 3:todos los formatos estándar de fecha y hora

Aquí hay otro que usa la cultura invariable, pero esta vez formateo un datetimeoffset valor utilizando todas las cadenas de formato de fecha y hora estándar admitidas por .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';

Resultado (usando salida vertical):

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

¿La cultura invariable no funciona en su sistema?

Si no puede hacer que la cultura invariable funcione en su sistema, podría deberse a que se está instalando una versión anterior de .NET Framework. La documentación de .NET Framework 4.8 establece explícitamente que la cultura invariable está disponible usando su código de dos letras ISO 639-1 "iv" .

Sin embargo, en esta pregunta de desbordamiento de pila, la respuesta de Solomon Rutzky sugiere que esto podría haber estado disponible solo desde .NET 4.5.

Si no puede hacer que funcione con una versión anterior de .NET, intente actualizar a la última versión (o una versión de al menos 4.5).