2010-07-28 38 views
14

Làm cách nào để chuyển đổi ngày [1-31] ​​và tháng [1-12] và một năm (tất cả int) thành ngày nối tiếp IN SQL (không chuyển đổi thành varchar)?Ngày nối tiếp trong SQL?

+0

Bằng mà không chuyển đổi để varchar, bạn có nghĩa là xây dựng một ngày theo tiêu chuẩn ISO 'yyyy-mm-dd' bị loại trừ? – pascal

+0

Tôi biết về ngày ISO. Nhưng nó thực sự làm việc? Trên MS-SQL 2005? Và trong tất cả các kết hợp có thể có của các ngôn ngữ/văn hóa (hệ điều hành, người dùng, người dùng cơ sở dữ liệu, người dùng IIS). Vâng, tôi biết nó là một tiêu chuẩn, nhưng tôi phải nói rằng tôi thực sự không có nhiều niềm tin vào cái gọi là tiêu chuẩn nữa. Bên cạnh đó, nó nhanh hơn mà không có varchar. –

+0

Ý của bạn là gì theo "ngày nối tiếp"? – onedaywhen

Trả lời

27

Zero là 1 tháng 1 năm 1900 trong SQL, vì vậy bạn có thể sử dụng này:

DATEADD(day, @dayval-1, 
    DATEADD(month, @monthval-1, 
     DATEADD(year, @yearval-1900, 0) 
    ) 
) 

Chỉnh sửa, tháng 2 năm 2018

Như câu trả lời khác nói, kể từ khi SQL Server 2012 (phát hành sau khi câu trả lời ban đầu) chúng ta có thể sử dụng DATEFROMPARTS

SELECT DATEFROMPARTS (@yearval, @monthval, @dayval) 
+0

Tuyệt vời - Cảm ơn! –

+0

+1 cho sự sang trọng. cảm ơn bạn! – RubyTuesdayDONO

+0

Nhận xét ở đây để giúp những người khác trong tương lai khi tôi gặp sự cố khi điều chỉnh các chuỗi ngày tháng và câu trả lời này đã giúp tôi tìm ra. Ngày nối tiếp trong SQL khác với Excel trong 1 ngày! –

10

Một vài chức năng đã được thêm vào trong SQL server 2012 mà sẽ cho phép bạn làm điều này với DATEFROMPARTS, DATETIMEFROMPARTSTIMEFROMPARTS trong số những người khác.

Ví dụ:

SELECT DATEFROMPARTS(2018,2,1) -- returns 2018-02-01