Me deparei com um formato inteiro para datas para as quais também sei a data, mas não sei como chegar a essa data no TSQL e também não sei como chegar ao número inteiro se tiver a data:
700444 -> 02/10/1918
731573 -> 24/12/2003
739479 -> 16/08/2025
Esses números de 6 dígitos serviriam como um contador para cada dia a partir de 0001-01-01, verifiquei isso obtendo o número de dias para um século a partir daquela data que é quase o ano 2000 e adicionando isso a 1900:
select DATEADD(dd,731573/20,'19000101')
Fora:
2000-02-24 00:00:00.000
Mas não consigo correr select DATEADD(dd,731573/20,'10000101')
, o que gera:
A conversão de um tipo de dados varchar em um tipo de dados datetime resultou em um valor fora do intervalo.
O Microsoft Learn diz que o TSQL permite datas apenas a partir de 1753-01-01, veja datetime (Transact-SQL) Microsoft Learn , assim:
select DATEADD(dd,731573/20,'17530101')
Fora:
1853-02-24 00:00:00.000
Porém, não posso adicionar 731573 ao ano 1. Então descobri Qual é o significado de 01/01/1753 no SQL Server? :
--(como dito em uma das respostas e em Por que você deve sempre escrever "varchar" com o comprimento entre colchetes atrás dele? Muitas vezes, você obtém o resultado certo sem fazer isso - DBA SE , pegue varchar(length)
em vez de apenas varchar
)--
SELECIONE CONVERT(VARCHAR, DATEADD(DAY,-731572,CAST('2003-12-24' AS DATETIME2)),100)
SELECT CONVERT(VARCHAR(30), DATEADD(DAY,-731572,CAST('2003-12-24' AS DATETIME2)),100)
Fora:
Jan 1 0001 12:00AM
Para que isso seja comprovado, o número são os dias a partir do primeiro dia do ano 0001. Agora me pergunto se consigo chegar lá sem formatar a coluna datetime como datetime2. Minhas datas são todas apenas nos séculos 20 e 21, então não preciso do arquivo datetime2
. Recebo os dados como data e hora e tento evitar uma conversão de tipo.
Como posso converter esse número inteiro em setecentos mil como o contador dos dias do ano 1 até uma data e como posso voltar da data para esse número inteiro sem converter a data em datetime2?