Trong câu hỏi sau đây, tên trường và bảng đã được thay đổi để bảo vệ danh tính của chúng.
Nếu tôi có hai cột cơ sở dữ liệu:
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)
Thành phần ngày của trường thời gian hầu hết được đặt thành ngày 1 tháng 1 năm 1753 ... nhưng một số dữ liệu có ngày 1 tháng 1 năm 1899 và một số có ngày 1 tháng 1 năm 1900.
Tôi thấy rằng việc duy trì mã để truy vấn và báo cáo về các cột này khiến tôi (và nhóm của chúng tôi) đau đầu có thể dễ dàng giải quyết bằng cách hợp nhất hai cột. Tuy nhiên, kinh nghiệm (và Terry Goodkind ) đã dạy tôi rằng không có gì là dễ dàng. Xem bên dưới một số ví dụ về lý do tại sao điều này là đau đầu.
Cách tiếp cận của tôi
Tôi nghĩ cách tiếp cận sau đây sẽ có hiệu quả mong muốn của việc hợp nhất hai cột:
- Sử dụng SQL để cập nhật dữ liệu, đặt giá trị cho trường ngày và giá trị cho trường thời gian cả hai thành cùng một giá trị, là sự pha trộn của thành phần ngày từ trường ngày và thành phần thời gian từ trường thời gian
- Viết bất kỳ mã mới chỉ sử dụng trường MONKEY_DATE
- Cuối cùng loại bỏ trường MONKEY_TIME và bất kỳ SQL thành phần ngày / giờ nào (xem ví dụ)
- Thả MONKEY_TIME
Điều này có nghĩa là chúng ta không cần phải ngay lập tức thực hiện các thay đổi hồi cứu cho toàn bộ hệ thống ... tất cả các mã hiện có sẽ tiếp tục hoạt động ... và chúng ta có thể bắt đầu thực hiện mọi thứ theo cách đúng đắn.
SQL cho # 1 có thể là (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')
Câu hỏi
Câu hỏi của tôi cho bạn là:
- Những lĩnh vực này có nên được sáp nhập?
- Cách tiếp cận của tôi có hợp lý để hợp nhất hai cột này không?
- Bạn có nghĩ rằng sẽ tốt hơn nếu bỏ qua bước hai và ba?
- Bạn có bất kỳ ý kiến hoặc đề xuất (xây dựng) khác?
Ví dụ
Ví dụ: để chọn tất cả ngày và giờ khỉ của tôi và sắp xếp chúng theo ngày và giờ, tôi cần phải làm một cái gì đó như thế này (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
hoặc cái này (Oracle - rõ ràng hơn một chút):
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
Tôi cũng thường thấy mình chọn cột ngày / giờ hợp nhất (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
Bởi vì, hầu như tất cả thời gian, chúng tôi muốn biết ngày và giờ của con khỉ.
SQL trên có thể dễ dàng được thay đổi thành:
SELECT MONKEY_DATE_TIME FROM MONKEY ORDER BY MONKEY_DATE_TIME
... Giá như chúng ta đã hợp nhất các cột.
Lý lịch
Tôi đã thừa hưởng một hệ thống ASP cũ lưu trữ ngày và giờ trong các cột riêng biệt trong cơ sở dữ liệu. Tôi được cho biết điều này có lẽ là do ứng dụng đã khởi động trong phiên bản đầu tiên của Access, nơi không thể lưu trữ cả ngày và giờ trong cùng một cột. Các whys và hows không thực sự là một phần của câu hỏi này, nhưng một số người muốn biết.
PS
Tôi thực sự gần như đã đăng bài này trên SO.SE, vì vậy tôi xin lỗi nếu tôi nhận được trang web sai.