Na pergunta a seguir, os nomes de campos e tabelas foram alterados para proteger suas identidades.
Se eu tiver duas colunas no banco de dados:
MONKEY_DATE DATETIME NULL (with data e.g. 2012-05-14 00:00:00.000)
MONKEY_TIME DATETIME NULL (with data e.g. 1753-01-01 16:30:53.025)
O componente de data do campo de horário é definido principalmente como 1º de janeiro de 1753 ... mas alguns dados têm 1º de janeiro de 1899 e outros 1 de janeiro de 1900.
Acho que manter o código para consultar e relatar essas colunas causa a mim (e nossa equipe) uma dor de cabeça que pode ser facilmente resolvida com a mesclagem das duas colunas. No entanto, a experiência (e Terry Goodkind ) me ensinou que nada é fácil. Veja abaixo alguns exemplos de por que isso é uma dor de cabeça.
Minha abordagem
Eu estou pensando que a seguinte abordagem terá o efeito desejado de mesclar as duas colunas:
- Use o SQL para atualizar os dados, configurando o valor para o campo de data e o valor para o campo de hora com o mesmo valor, que é uma mistura do componente de data do campo de data e o componente de hora do campo de hora
- Escreva qualquer novo código apenas usando o campo MONKEY_DATE
- Eventualmente, elimine gradualmente o campo MONKEY_TIME e qualquer componente SQL de data / hora (veja exemplos)
- Solte MONKEY_TIME
Isso significa que não precisamos imediatamente fazer alterações retrospectivas em todo o sistema ... todo o código existente continuará funcionando ... e podemos começar a fazer as coisas da maneira certa.
O SQL para o número 1 pode ser (Oracle):
UPDATE MONKEY SET
MONKEY_DATE = TO_DATE(TO_CHAR(MONKEY_DATE, 'MM/DD/YYYY ') ||
TO_CHAR(MONKEY_TIME, 'HH24:MI:SS'),
'MM/DD/YYYY HH24:MI:SS')
MONKEY_TIME = TO_DATE(TO_CHAR(MONKEY_DATE, 'MM/DD/YYYY ') ||
TO_CHAR(MONKEY_TIME, 'HH24:MI:SS'),
'MM/DD/YYYY HH24:MI:SS')
A questão
Minhas perguntas para você são:
- Esses campos devem ser mesclados?
- Minha abordagem é razoável para mesclar essas duas colunas?
- Você acha que seria melhor pular as etapas dois e três?
- Você tem outros comentários ou sugestões (construtivos)?
Exemplos
Por exemplo, para selecionar todas as datas e horários dos meus macacos e ordená-los por data e hora, preciso fazer algo assim (SQL Server):
SELECT
CONVERT(DATETIME, CONVERT(VARCHAR, MONKEY_DATE, 101), 101) AS MONKEY_DATE
, CONVERT(DATETIME, CONVERT(VARCHAR, MONKEY_TIME, 108), 108) AS MONKEY_TIME
FROM MONKEY
ORDER BY
CONVERT(DATETIME, CONVERT(VARCHAR, MONKEY_DATE, 101), 101) DESC
, CONVERT(DATETIME, CONVERT(VARCHAR, MONKEY_TIME, 108), 108) DESC
ou este (Oracle - um pouco mais explícito):
SELECT
TO_DATE(TO_CHAR(MONKEY_DATE, 'MM/DD/YYYY'), 'MM/DD/YYYY') AS MONKEY_DATE
, TO_DATE(TO_CHAR(MONKEY_TIME, 'HH24:MI:SS'), 'HH24:MI:SS') AS MONKEY_TIME
FROM MONKEY
ORDER BY
TO_DATE(TO_CHAR(MONKEY_DATE, 'MM/DD/YYYY'), 'MM/DD/YYYY') DESC
, TO_DATE(TO_CHAR(MONKEY_TIME, 'HH24:MI:SS'), 'HH24:MI:SS') DESC
Também frequentemente me vejo selecionando uma coluna de data / hora mesclada (Oracle):
SELECT
TO_DATE(TO_CHAR(MONKEY_DATE, 'MM/DD/YYYY ') ||
TO_CHAR(MONKEY_TIME, 'HH24:MI:SS'),
'MM/DD/YYYY HH24:MI:SS') AS MONKEY_DATE_TIME
FROM MONKEY
Porque, quase o tempo todo, queremos saber a data e a hora do macaco.
O SQL acima pode ser facilmente alterado para:
SELECT MONKEY_DATE_TIME FROM MONKEY ORDER BY MONKEY_DATE_TIME
... Se ao menos tivéssemos mesclado colunas.
fundo
Eu herdei um sistema ASP antigo que armazena datas e horas em colunas separadas no banco de dados. Disseram-me que isso ocorre provavelmente porque o aplicativo foi iniciado em uma versão anterior do Access, onde não era possível armazenar data e hora na mesma coluna. Os porquês e os comos não fazem parte dessa pergunta, mas algumas pessoas gostam de saber.
PS
Eu realmente quase publiquei isso no SO.SE, então peço desculpas se obtive o site errado.