AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 84790
Accepted
IT researcher
IT researcher
Asked: 2014-12-11 03:40:02 +0800 CST2014-12-11 03:40:02 +0800 CST 2014-12-11 03:40:02 +0800 CST

Problemas com SET DATEFORMAT

  • 772

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?

sql-server sql-server-2008-r2
  • 2 2 respostas
  • 24557 Views

2 respostas

  • Voted
  1. Best Answer
    Thomas Kejser
    2014-12-11T04:04:17+08:002014-12-11T04:04:17+08:00

    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:

    SELECT CAST(0 AS SMALLDATETIME)
    

    Resultado: 1900-01-01 00:00:00

    Da mesma forma, para DATETIME:

    SELECT CAST(0 AS DATETIME)
    

    Resultado: 1900-01-01 00:00:00.000

    Curiosamente, isso falha:

    SELECT CAST(0 AS DATE)
    

    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

    O DATEFORMAT ydm não é compatível com os tipos de dados date, datetime2 e datetimeoffset.

    Porque isto é assim? Dentro do mecanismo de banco de dados , DATEpegue 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.DATETIME2DATETIMEOFFSETDATETIMESMALLDATETIMEDATETIME/SMALLDATETIMEDATESMALLDATETIME

    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.

    • 6
  2. Mark Sinkinson
    2014-12-11T04:20:31+08:002014-12-11T04:20:31+08:00

    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 DATEFORMATpara 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 LANGUAGEconfigurações.

    CREATE TABLE #tempTable (DateFormatSample DATE, ID INT IDENTITY(1,1));
    
    INSERT INTO #tempTable
    VALUES ('08/07/2007');
    
    INSERT INTO #tempTable
    VALUES ('07/08/2007');
    

    Com base na minha configuração de idioma dos EUA, isso insere:

    DateFormatSample    ID
    2007-08-07           1
    2007-07-08           2
    

    No entanto, se eu definir o DATEFORMATformato do Reino Unido ....:

    CREATE TABLE #tempTable (DateFormatSample DATE, ID INT IDENTITY(1,1));
    
    SET DATEFORMAT DMY;
    
    INSERT INTO #tempTable
    VALUES ('08/07/2007');
    
    INSERT INTO #tempTable
    VALUES ('07/08/2007');
    

    Recebo um dia e um mês completamente diferentes:

    DateFormatSample    ID
    2007-07-08           1
    2007-08-07           2
    

    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.

    • 2

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve