In der folgenden Frage wurden Feld- und Tabellennamen geändert, um ihre Identität zu schützen.
Wenn ich zwei Datenbankspalten habe:
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)
Die Datumskomponente des Zeitfelds ist meistens auf den 1. Januar 1753 eingestellt ... aber einige Daten haben den 1. Januar 1899 und einige den 1. Januar 1900.
Ich finde, dass das Verwalten des Codes zum Abfragen und Berichten dieser Spalten mir (und unserem Team) Kopfschmerzen bereitet, die leicht durch Zusammenführen der beiden Spalten gelöst werden könnten. Die Erfahrung (und Terry Goodkind ) hat mich jedoch gelehrt, dass nichts jemals einfach ist. Nachfolgend einige Beispiele, warum dies Kopfschmerzen sind.
Mein Ansatz
Ich denke, der folgende Ansatz hat den gewünschten Effekt, wenn die beiden Spalten zusammengeführt werden:
- Verwenden Sie SQL, um die Daten zu aktualisieren, und setzen Sie den Wert für das Datumsfeld und den Wert für das Zeitfeld auf denselben Wert. Dies ist eine Mischung aus der Datumskomponente aus dem Datumsfeld und der Zeitkomponente aus dem Zeitfeld
- Schreiben Sie neuen Code nur mit dem Feld MONKEY_DATE
- Schließen Sie schließlich das Feld MONKEY_TIME und die Datums- / Zeitkomponente SQL aus (siehe Beispiele).
- Löschen Sie MONKEY_TIME
Dies bedeutet, dass wir nicht sofort nachträglich Änderungen am gesamten System vornehmen müssen ... der gesamte vorhandene Code wird weiterhin funktionieren ... und wir können beginnen, die Dinge richtig zu machen.
SQL für # 1 könnte sein (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')
Die Frage
Meine Fragen an Sie sind:
- Sollten diese Felder zusammengeführt werden?
- Ist mein Ansatz sinnvoll, diese beiden Spalten zusammenzuführen?
- Denken Sie, es wäre besser, die Schritte zwei und drei zu überspringen?
- Haben Sie weitere (konstruktive) Kommentare oder Vorschläge?
Beispiele
Um beispielsweise alle meine Affendaten und -zeiten auszuwählen und nach Datum und Uhrzeit zu ordnen, muss ich Folgendes tun (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
oder dies (Oracle - etwas expliziter):
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
Ich finde mich auch oft dabei, eine zusammengeführte Datums- / Zeitspalte (Oracle) auszuwählen:
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
Weil wir fast immer das Datum und die Uhrzeit des Affen wissen wollen.
Das obige SQL kann leicht geändert werden in:
SELECT MONKEY_DATE_TIME FROM MONKEY ORDER BY MONKEY_DATE_TIME
... Wenn wir nur Spalten zusammengeführt hätten.
Hintergrund
Ich habe ein altes ASP-System geerbt, das Datum und Uhrzeit in separaten Spalten in der Datenbank speichert. Mir wurde gesagt, dass dies wahrscheinlich daran liegt, dass die Anwendung in einer frühen Version von Access gestartet wurde, in der es nicht möglich war, Datum und Uhrzeit in derselben Spalte zu speichern. Das Warum und Wie ist nicht wirklich Teil dieser Frage, aber einige Leute möchten es wissen.
PS
Ich habe das wirklich fast in SO.SE gepostet, also entschuldige ich mich, wenn ich die falsche Seite habe.