次の質問では、フィールドとテーブルの名前がIDを保護するために変更されています。
2つのデータベース列がある場合:
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)
時間フィールドの日付コンポーネントは、ほとんどが1753年1月1日に設定されています...しかし、一部のデータは1899年1月1日で、一部は1900年1月1日です。
これらの列をクエリおよびレポートするコードを維持すると、私(および私たちのチーム)は2つの列をマージすることで簡単に解決できる頭痛の種を引き起こします。しかし、経験(およびTerry Goodkind)は、決して簡単なことはないことを教えてくれました。これが頭痛の原因であるいくつかの例を以下に示します。
私のアプローチ
次のアプローチには、2つの列をマージするという望ましい効果があると思います。
- SQLを使用してデータを更新し、日付フィールドの値と時間フィールドの値の両方を同じ値に設定します。これは、日付フィールドの日付コンポーネントと時間フィールドの時間コンポーネントの混合です。
- MONKEY_DATEフィールドのみを使用して新しいコードを記述します
- 最終的にMONKEY_TIMEフィールドと日付/時刻コンポーネントSQLを段階的に廃止します(例を参照)
- MONKEY_TIMEをドロップ
これは、すぐに行ってシステム全体に遡及的な変更を加える必要がないことを意味します。既存のコードはすべて引き続き機能します...そして、正しい方法で作業を開始できます。
#1のSQLは(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')
質問
あなたへの私の質問は:
- これらのフィールドをマージする必要がありますか?
- これらの2つの列をマージするための私のアプローチは妥当ですか?
- ステップ2と3をスキップする方が良いと思いますか?
- 他に(建設的な)コメントや提案はありますか?
例
たとえば、サルの日付と時刻をすべて選択し、日付と時刻で並べ替えるには、次のようにする必要があります(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
またはこれ(Oracle-もう少し明示的):
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
また、結合された日付/時刻列(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
いつものように、サルの日付と時刻を知りたいからです。
上記のSQLは次のように簡単に変更できます。
SELECT MONKEY_DATE_TIME FROM MONKEY ORDER BY MONKEY_DATE_TIME
...列をマージした場合のみ。
バックグラウンド
日付と時刻をデータベースの別々の列に格納する古いASPシステムを継承しました。これはおそらく、アプリケーションがAccessの初期バージョンで開始されたため、日付と時刻の両方を同じ列に格納することができなかったためだと言われています。理由と方法はこの質問の一部ではありませんが、知りたい人もいます。
PS
私は本当にこれをSO.SEに投稿するところだったので、間違ったサイトを取得した場合の私の謝罪。