2013-09-04 72 views
16

Sử dụng SQL Server 2008, truy vấn này hoạt động tuyệt vời:Kết hợp (concatenating) ngày và thời gian vào một datetime

select CAST(CollectionDate as DATE), CAST(CollectionTime as TIME) 
from field 

Cung cấp cho tôi hai cột như thế này:

2013-01-25 18:53:00.0000000 
2013-01-25 18:53:00.0000000 
2013-01-25 18:53:00.0000000 
2013-01-25 18:53:00.0000000 
    . 
    . 
    . 

Tôi đang cố gắng để kết hợp chúng vào một ngày giờ duy nhất bằng dấu cộng, như sau:

select CAST(CollectionDate as DATE) + CAST(CollectionTime as TIME) 
from field 

Tôi đã xem xét khoảng mười trang web, bao gồm các câu trả lời o n trang web này (như this one), và tất cả họ dường như đồng ý rằng dấu cộng nên làm việc nhưng tôi nhận được lỗi:

Msg 8117, Level 16, State 1, Line 1
Operand data type date is invalid for add operator.

Tất cả các trường là khác không và không null. Tôi cũng đã thử hàm CONVERT và cố gắng truyền các kết quả này dưới dạng varchars, cùng một vấn đề. Điều này không thể khó khăn như tôi đang làm.

Ai đó có thể cho tôi biết tại sao điều này không hiệu quả? Cảm ơn vì bất kì sự giúp đỡ.

+1

là gì các kiểu dữ liệu ban đầu cho mỗi cột ?, và nếu họ được chuỗi, như thế nào là dữ liệu lưu trữ ở đó? (YYYY-MM-DD, YYYYMMDD, v.v ..) – Lamak

+0

Thực ra, câu hỏi tiếp theo cho bạn và @Aaron Bertrand, nếu tôi ĐANG ĐÚC (hoặc CHUYỂN ĐỔI) dữ liệu của tôi trong chính truy vấn, có quan trọng không nếu dữ liệu cơ bản được lưu trữ như là chuỗi hoặc ngày? Tôi đang lưu trữ như các lĩnh vực datetime, nhưng chỉ tò mò. – Stanton

+0

@Stanton chắc chắn, nó không quan trọng. Tại sao phải trải qua hai cấp độ truyền/chuyển đổi khi bạn có thể không cần? –

Trả lời

30

Giả sử các kiểu dữ liệu cơ bản là ngày/giờ/datetime vv

SELECT CONVERT(DATETIME, CONVERT(CHAR(8), CollectionDate, 112) 
    + ' ' + CONVERT(CHAR(8), CollectionTime, 108)) 
    FROM dbo.whatever; 

Nếu họ không, TẠI SAO KHÔNG, và để có được câu trả lời có ý nghĩa, bạn sẽ cần phải cho chúng tôi biết chúng là loại gì và định dạng dữ liệu được lưu trữ. Hoặc chỉ cần sửa bảng.

+0

Aaron, cảm ơn bạn đã trả lời của bạn, và cái nhìn sâu sắc vào câu hỏi tiếp theo của tôi ở trên sẽ được đánh giá cao. – Stanton

+0

Hoạt động cho sql-server-2012. Công việc tốt đẹp – FirebladeDan

-4

Sử dụng concat Mysql có chức năng này

+0

Nhưng điều này là dành cho SQL Server – Lamak

+0

Cố gắng rằng, không hoạt động với MS SQL 2008. – Stanton

+0

Nó sẽ không. concat là một hàm chuỗi. – Amy

7

Cast nó để datetime thay vì:

select CAST(CollectionDate as DATETIME) + CAST(CollectionTime as TIME) 
from field 

này hoạt động trên SQL Server 2008 R2.

Nếu vì một số lý do bạn muốn đảm bảo phần đầu tiên không có thành phần thời gian, trước tiên hãy truyền trường này, sau đó quay lại datetime.

+2

'Msg 402, Cấp 16, Tiểu bang 1, Dòng 1 - Thời gian và giờ của loại dữ liệu không tương thích trong toán tử thêm.' –

+0

Bullseye! Cám ơn rất nhiều! – Stanton

+0

@AaronBertrand, bạn đang sử dụng phiên bản SQL Server nào? – Amy

1
DECLARE @ADate Date, @ATime Time, @ADateTime Datetime 

SELECT @ADate = '2010-02-20', @ATime = '18:53:00.0000000' 

SET @ADateTime = CAST (
    CONVERT(Varchar(10), @ADate, 112) + ' ' + 
    CONVERT(Varchar(8), @ATime) AS DateTime) 

SELECT @ADateTime [A nice datetime :)] 

Điều này sẽ cho bạn kết quả hợp lệ.

0
drop table test 

create table test(
    CollectionDate date NULL, 
    CollectionTime [time](0) NULL, 
    CollectionDateTime as (isnull(convert(datetime,CollectionDate)+convert(datetime,CollectionTime),CollectionDate)) 
-- if CollectionDate is datetime no need to convert it above 
) 

insert test (CollectionDate, CollectionTime) 
values ('2013-12-10', '22:51:19.227'), 
     ('2013-12-10', null), 
     (null, '22:51:19.227') 

select * from test 

CollectionDate CollectionTime CollectionDateTime 
2013-12-10  22:51:19  2013-12-10 22:51:19.000 
2013-12-10  NULL   2013-12-10 00:00:00.000 
NULL   22:51:19  NULL 
0

này hoạt động trong SQL 2008 và 2012 để sản xuất datetime2:

declare @date date = current_timestamp; 
declare @time time = current_timestamp; 

select 
@date as date 
,@time as time 
,cast(@date as datetime) + cast(@time as datetime) as datetime 
,cast(@time as datetime2) as timeAsDateTime2 
,dateadd(dayofyear,datepart(dayofyear,@date) - 1,dateadd(year,datepart(year,@date) - 1900,cast(@time as datetime2))) as datetime2; 
-1
SELECT CONVERT(DATETIME, CONVERT(CHAR(8), date, 112) + ' ' + CONVERT(CHAR(8), time, 108)) 
    FROM tablename 
5

Một giải pháp dễ dàng hơn (thử nghiệm trên SQL Server 2014 SP1 CU6)

Code:

DECLARE @Date date = SYSDATETIME(); 

DECLARE @Time time(0) = SYSDATETIME(); 

SELECT CAST(CONCAT(@Date, ' ', @Time) AS datetime2(0)); 

Điều này cũng sẽ hoạt động với một bảng có chữ sp ngày sinh thái và một lĩnh vực thời gian cụ thể. Tôi thường xuyên sử dụng phương pháp này vì chúng tôi có dữ liệu nhà cung cấp sử dụng ngày và giờ trong hai trường riêng biệt.

3

Giải pháp đơn giản

SELECT CAST(CollectionDate as DATETIME) + CAST(CollectionTime as DATETIME) 
FROM field 
Các vấn đề liên quan