Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como converter uma string em uma data/hora no SQL Server usando PARSE()


Se você trabalha com SQL Server, é provável que tenha usado pelo menos um dos métodos CONVERT() ou CAST() funções para converter de um tipo de dados para outro. Se você já encontrou um erro ao tentar converter uma string em um tipo de dados de data/hora, o PARSE() função pode ser o que você precisa.

Por exemplo, se você tiver uma string como, digamos, Sex, 20 de julho de 2018 , o CONVERT() ou CAST() funções lançarão um erro. Mas o PARSE() função irá lidar com isso sem problemas.

O PARSE() A função retorna o resultado de uma expressão, traduzida para o tipo de dados solicitado no SQL Server. Assim, você pode usá-lo para “traduzir” seu valor de string em um tipo de dados de data/hora (como data , datahora , datahora2 , etc).


Sintaxe


Aqui está a sintaxe para o PARSE() função:
PARSE ( string_value AS data_type [ USING culture ] )

Onde string_value é o valor que você deseja analisar, data_type é o tipo de dados que você deseja analisar e culture é um argumento opcional que você pode usar para especificar qual formato de idioma usar ao analisar a string.

Exemplo básico


Aqui está um exemplo básico para demonstrar o uso.
SELECT PARSE('Friday, 20 July 2018' AS datetime2) 
AS 'Result';

Resultado:
+-----------------------------+
| Result                      |
|-----------------------------|
| 2018-07-20 00:00:00.0000000 |
+-----------------------------+

Remover a parte do tempo


No exemplo anterior, especificamos que a string deve ser analisada como um datetime2 tipo de dados. Este tipo de dados inclui o componente de tempo com alta precisão. Se você não precisar do componente de hora, sempre poderá analisá-lo como uma data tipo de dados.

Aqui está o resultado se especificarmos uma data tipo de dados:
SELECT PARSE('Friday, 20 July 2018' AS date) 
AS 'Result';

Resultado:
+------------+
| Result     |
|------------|
| 2018-07-20 |
+------------+

Mantenha a parte do tempo, mas com menos precisão


E se você fazer precisa do tempo, mas com menos precisão, você sempre pode usar o smalldatetime tipo de dados:
SELECT PARSE('2:35:50pm, Friday, 20 July 2018' AS smalldatetime) 
AS 'Result';

Resultado:
+---------------------+
| Result              |
|---------------------|
| 2018-07-20 14:36:00 |
+---------------------+

Mas se isso não for preciso o suficiente, sempre há o datetime tipo de dados:
SELECT PARSE('2:35:50.5234pm, Friday, 20 July 2018' AS datetime) 
AS 'Result';

Resultado:
+-------------------------+
| Result                  |
|-------------------------|
| 2018-07-20 14:35:50.523 |
+-------------------------+

Variações da entrada de data


O PARSE() A função geralmente pode descobrir a data que você está tentando converter, desde que você a forneça como uma representação válida do tipo de dados solicitado. Aqui estão alguns exemplos da data sendo fornecida em vários estilos:
SELECT 
    PARSE('Friday, 20 July 2018' AS date) AS 'Result 1',
    PARSE('Fri, 20 July 2018' AS date) AS 'Result 2',
    PARSE('Friday, July 20 2018' AS date) AS 'Result 3',
    PARSE('Fri 20 Jul 18' AS date) AS 'Result 4';

Resultado:
+------------+------------+------------+------------+
| Result 1   | Result 2   | Result 3   | Result 4   |
|------------+------------+------------+------------|
| 2018-07-20 | 2018-07-20 | 2018-07-20 | 2018-07-20 |
+------------+------------+------------+------------+

No entanto, não é psíquico:
SELECT PARSE('Next Friday' AS date) 
AS 'Result';

Resultado:
Error converting string value 'Next Friday' into data type date using culture ''. 

Adicionar uma cultura


Você pode adicionar um terceiro argumento para especificar em qual cultura sua string está formatada. Por exemplo, se sua data for 01/06/2018 , isso pode significar 6 de janeiro de 2018 ou 1º de junho de 2018 , dependendo da cultura que está sendo usada.

Aqui está um exemplo de especificação da cultura:
SELECT 
    PARSE('01/06/2018' AS date USING 'en-US') AS 'en-US',
    PARSE('01/06/2018' AS date USING 'en-GB') AS 'en-GB';

Resultado:
+------------+------------+
| en-US      | en-GB      |
|------------+------------|
| 2018-01-06 | 2018-06-01 |
+------------+------------+

Se você não fornecer esse argumento, o idioma da sessão atual será usado.

Fornecendo o dia da semana errado


O PARSE() A função é bastante inteligente, pois, se você fornecer o dia da semana errado, ela retornará um erro.

Então, se usarmos a mesma data dos exemplos anteriores, mas mudarmos o dia da semana de sexta para quinta, eis o que acontece:
SELECT PARSE('Thursday, 20 July 2018' AS date) 
AS 'Result';

Resultado:
Error converting string value 'Thursday, 20 July 2018' into data type date using culture ''.