Estou com algumas dúvidas sobre o comando SET DATEFORMAT .
1) Este comando é usado apenas para inserir e atualizar o formato de data e não afeta o formato de data dessa coluna? OU isso afeta minha tabela depois de inserir valores também?
2) Tentei usar o comando abaixo (para tipo de dados de data) e recebi um erro como This session's YDM date format is not supported when converting from this character string format to date, time, datetime2 or datetimeoffset. Change the session's date format or provide a style to the explicit conversion.
. por que o erro vem para o tipo de dados de data (onde, para smalldatetime, funciona conforme mostrado no link)?
CREATE TABLE #tempTable (DateFormatSample DATE)
SET DATEFORMAT MDY
INSERT INTO #tempTable
VALUES ('09/28/2007')
SET DATEFORMAT YDM
INSERT INTO #tempTable
VALUES ('2007/28/09')
SET DATEFORMAT YMD
INSERT INTO #tempTable
VALUES ('2007/08/28')
SELECT DateFormatSample
FROM #tempTable
DROP TABLE #tempTable
3) Foi mencionado como "A configuração de SET DATEFORMAT é definida no tempo de execução ou execução e não no tempo de análise." O que isto significa?
1) SET DATEFORMAT não tem efeito no armazenamento real da tabela. Ele é usado apenas para formatar a saída e interpretar strings. Nos bastidores, todos os formatos de data são armazenados como números inteiros em um formato canônico.
A representação real do tipo de dados depende de qual tipo é usado. Por exemplo,
SMALLDATETIME
é um número inteiro que armazena o número de segundos desde 1900-01-01. Algumas dessas bolhas vêm à superfície quando você lança assim:Resultado: 1900-01-01 00:00:00
Da mesma forma, para
DATETIME
:Resultado: 1900-01-01 00:00:00.000
Curiosamente, isso falha:
Com exceção: A conversão explícita do tipo de dados int para date não é permitida.
Como deve ser óbvio, algo não está bem desenvolvido com os novos tipos.
2) Esta limitação está documentada aqui: http://msdn.microsoft.com/en-gb/library/ms189491.aspx
Porque isto é assim? Dentro do mecanismo de banco de dados ,
DATE
pegue caminhos de código diferentes de e (você pode validar isso com um criador de perfil). Como os novos formatos de data chegaram à base de código do SQL Server muito tempo depois - diferentes programadores trabalharam nisso e, portanto, algumas funcionalidades não estão 100% alinhadas (ainda). Outro exemplo: nas versões anteriores do SQL Server 2008R2, o carregamento em massa de a era muito mais lento do que o carregamento em massa de a , mesmo que um fosse menor que o outro. Isso foi corrigido antes do lançamento. É o tipo de coisa que acontece em uma grande organização com muitos programadores.DATETIME2
DATETIMEOFFSET
DATETIME
SMALLDATETIME
DATETIME/SMALLDATETIME
DATE
SMALLDATETIME
3) Isso significa que não é possível saber se o formato de data é válido até que você realmente o experimente. No seu caso, significa que mesmo que você faça um "mostrar plano de consulta" sem execução, você não saberá que há um erro no formato até que realmente execute a consulta.
Embora não seja uma resposta direta à pergunta, não estou totalmente convencido de que os exemplos mostrados na postagem do blog à qual você vinculou sejam realmente um bom exemplo de
SET DATEFORMAT
.Uma das principais razões pelas quais você deve usar
DATEFORMAT
, é quando uma data pode ser interpretada de várias maneiras.Se você trabalha para uma empresa global onde os formatos de data variam entre os países, é vital que você use
DATEFORMAT
para definir especificamente o formato que espera receber.Digamos que eu more nos Estados Unidos e importe um arquivo de colegas do Reino Unido. No exemplo abaixo, a data importada será diferente dependendo de suas
LANGUAGE
configurações.Com base na minha configuração de idioma dos EUA, isso insere:
No entanto, se eu definir o
DATEFORMAT
formato do Reino Unido ....:Recebo um dia e um mês completamente diferentes:
A consulta não apresentará erro, pois a data é válida, porém você obterá resultados inesperados. Você pode importar 12 dias inteiros de dados no formato errado todos os meses, jogando seu sistema no caos.