2013-08-19 61 views
6

Tôi có một cột năm có chứa những thứ như 2013, 2012, v.v. Cột tháng hiển thị 1-12 và cột ngày có chứa 1-31. Tôi cần phải chạy một lựa chọn mà nối chúng và đúc chúng như là một ngày thực tế, nhưng tôi không chắc chắn làm thế nào để đi về điều này. Bất cứ ai có thể cung cấp một số đầu vào?Làm thế nào để biến các cột năm, tháng và ngày riêng biệt thành một ngày?

+0

Các cột có phải là ký tự để bắt đầu không? – Brad

+1

Cũng sẽ tuyệt vời nếu bạn gắn thẻ câu hỏi của mình với phiên bản SQL Server chính xác mà bạn cần hỗ trợ. Có những câu trả lời khác nhau và tốt hơn tùy thuộc vào phiên bản của SQL Server bạn đang sử dụng. –

Trả lời

11

Đối với SQL Server 2008+:

SELECT CONVERT(DATE,CAST([Year] AS VARCHAR(4))+'-'+ 
        CAST([Month] AS VARCHAR(2))+'-'+ 
        CAST([Day] AS VARCHAR(2))) 

Đối với SQL Server 2005:

SELECT CONVERT(DATETIME,CAST([Year] AS VARCHAR(4))+ 
         RIGHT('00'+CAST([Month] AS VARCHAR(2)),2)+ 
         RIGHT('00'+CAST([Day] AS VARCHAR(2)),2)) 
+0

Cảm ơn bạn, đã hoạt động hoàn hảo. – user2361820

+0

Tôi nghĩ bạn đã nói đây là một chức năng của Oracle? –

-1

Bạn có thể thử một cái gì đó như thế này nếu các cột của bạn là cột nhân vật

Select Cast([year] + '-' + [month] + '-' + [day] as datetime) 
From yourTable 

Nếu họ là số bạn sẽ cần phải đúc mỗi cột để varchar trước khi nối nếu không bạn sẽ kết thúc nhận được someth ing sôi nổi

+0

Nếu nó hoạt động hay không phụ thuộc vào cài đặt máy chủ. Hãy thử 'SET DATEFORMAT dmy; SELECT CAST ('2012-01-03' AS datetime)' cho một bất ngờ – adrianm

+0

@adrianm Thú vị, tại sao điều này không ảnh hưởng đến hàm 'CONVERT' trong câu trả lời hàng đầu? – Brad

+0

@adrianm nhưng cũng nếu tôi làm 'SET DATEFORMAT dmy; Chọn năm (CAST ('2012-01-03' AS datetime)) 'Tôi nhận được năm 2012 ở đâu như tôi mong đợi nó trả lại một lỗi hoặc 3? – Brad

-2

Sử dụng chức năng Convert

Select Convert(datetime ,YEAR + '/' + MM + '/' + DAY) 

Thay YEAR với cột năm của bạn, MM với tháng, và DAY với cột ngày của bạn. và tiếp nhau để xây dựng chuỗi ngày của bạn

+4

Điều này có vẻ là cho Oracle, nhưng câu hỏi được gắn thẻ với SQL Server – Lamak

+0

Tôi đoán 'Từ kép' là những gì bạn đang nói về? có thể là Oracle nhưng hàm 'Chuyển đổi' là một hàm ** SQL-Server **. –

+0

Có, 'CONVERT' là một hàm SQL Server, nhưng' YEAR' và 'DAY' là các từ dành riêng, vì vậy bạn không thể sử dụng chúng mà không kèm theo chúng trong' [] '. Và bạn cũng thiếu định dạng 'CONVERT' để xác định rằng bạn đang chuyển ngày trên' YYYY/MM/DD'. Cuối cùng, bạn giả định rằng tất cả các cột là ký tự, vì bạn không chuyển đổi chúng trước. (Oh, tôi quên mất, tôi thậm chí đã không downvoted câu trả lời của bạn ở nơi đầu tiên) – Lamak

5
SELECT CAST(STR(10000 * Year + 100 * Month + Day) AS DATETIME) 
+0

Cảm ơn bạn đã giải pháp, tôi đã có cột năm và tháng trong bảng và tôi muốn kiểm tra nó với ngày bắt đầu và ngày kết thúc..Vì vậy tôi đã tìm kiếm giải pháp bằng cách sử dụng mà tôi có thể xây dựng ngày trong SQL và kiểm tra với ngày bắt đầu và kết thúc ... CAST ((10000 * ci.year + 100 * ci.month + 01) AS DATETIME)> = startDate –

0

Một hơn, chỉ để lấp đầy danh sách các cách tiếp cận khác nhau:

select 
    dateadd(d, t.d-1, dateadd(m, t.m-1, dateadd(yy, t.y-1900, 0))) 
from (values 
     (2011, 10, 26) 
     ,(2012, 1, 5) 
     ,(2013, 7, 15) 
    ) t(y, m, d) 
4

Trong SQL Server 2012, bạn có thể sẽ được tốt hơn tránh nối chuỗi hoặc toán học phức tạp , như họ đã tạo ra một chức năng dường như chỉ dành cho bạn:

SELECT DATEFROMPARTS(2013, 8, 19); 

Tất nhiên, lưu trữ các dữ liệu sai ngay từ đầu có thể dẫn đến các vấn đề - ví dụ, những gì hạn chế ngăn chặn s y = 2013, m = 2 và d = 31 trong bảng? Bạn nghĩ bạn có thể bọc rằng với TRY_CONVERT(), nhưng không quá nhiều:

SELECT TRY_CONVERT(DATE, DATEFROMPARTS(2013, 2, 31)); 

Lỗi:

Msg 289, Level 16, State 1, Line 3
Cannot construct data type date, some of the arguments have values which are not valid.

Vì vậy, để ngăn chặn dữ liệu xấu từ đi vào ba cột này, bạn sẽ cần sử dụng một trong các phương pháp rườm rà trên trong một hạn chế séc hoặc kích hoạt một ...

... hoặc ...

... trong bất kỳ phiên bản, bạn có thể sửa chữa bàn và lưu trữ một ngày (hoặc datetime) ở nơi đầu tiên. Bạn nhận được tất cả các lợi ích của việc xác thực tự động cũng như chức năng ngày/giờ bên trong mà bạn không nhận được với ba số nguyên không liên quan riêng biệt. Tốt hơn hết là rút các phần ra khi bạn cần chúng một cách riêng biệt (với các cột được tính toán, một khung nhìn hoặc thời gian truy vấn) từ một giá trị được đảm bảo là ngày, hơn là cố gắng dựa vào các phần riêng lẻ để tạo thành một ngày hợp lệ. ..

Các vấn đề liên quan