Cách chuyển đổi ngày giờ thành chuỗi trong T-SQL


91

Tôi ngạc nhiên khi không thể tìm thấy câu hỏi này ở đây.

Tôi có var date time và tôi muốn chuyển đổi nó thành một chuỗi để tôi có thể nối nó vào một chuỗi khác. Tôi muốn nó ở định dạng có thể dễ dàng chuyển đổi trở lại ngày giờ.

Tôi có thể làm cái này như thế nào?

(Tôi muốn phần ngày và phần thời gian.)


@TonyHopkinson Tôi cũng nhận được rất nhiều lượt truy cập nhưng dường như tất cả chúng đều đang chuyển đổi theo cách khác. Hoặc muốn một cái gì đó phức tạp hơn.
cja

3
Nhập Convert, nhấp đúp để tô sáng, nhấn Shift + F1 ... luôn là tuyến phòng thủ đầu tiên.
Eric J. Price

Câu trả lời:


156

Truy vấn sau sẽ lấy ngày giờ hiện tại và chuyển đổi thành chuỗi. với định dạng sau
yyyy-mm-dd hh:mm:ss(24h)

SELECT convert(varchar(25), getdate(), 120) 

49
Tôi vẫn không thể vượt qua thực tế là bạn phải vượt qua con số tùy ý để có được định dạng phù hợp
CJA

4
@cja Tôi hoàn toàn chia sẻ sự ngạc nhiên của bạn. Tôi muốn cung cấp một chuỗi, như yyddss để có định dạng chính xác mà tôi muốn. Có thể có một lý do kỹ thuật hoặc lịch sử cho điều này. Nhưng vẫn còn - rất hoành tráng.
Konrad Viltersten

2
Cảm ơn đã sửa chữa nhanh chóng nhưng trong câu trả lời của bạn, bạn được mã hóa những tháng như phút, hh yyyy-MM-dd: mm: ss hh KHÔNG yyyy-mm-dd: mm: ss
Tom Martin

Mặc dù điều này đã cũ, nhưng tôi chỉ tình cờ gặp chủ đề này. Khi sử dụng DateTimeOffSet, hãy nhớ điều chỉnh varcharđộ dài theo ý bạn muốn kết quả của bạn trông như thế nào. Đối với tôi, tôi không muốn múi giờ nên tôi phải sử dụngSELECT convert(varchar(19), sysdatetimeoffset(), 120)
RoLYroLLs


7

Bạn có thể sử dụng convertcâu lệnh trong Microsoft SQL Server để chuyển đổi ngày tháng thành chuỗi. Một ví dụ về cú pháp được sử dụng sẽ là:

SELECT convert(varchar(20), getdate(), 120)

Ở trên sẽ trả về ngày và giờ hiện tại trong một chuỗi có định dạng là YYYY-MM-DD HH:MM:SSđồng hồ 24 giờ.

Bạn có thể thay đổi số ở cuối câu lệnh thành một trong nhiều số sẽ thay đổi định dạng chuỗi được trả về. Bạn có thể tìm thấy danh sách các mã này trên MSDN trong phần tham chiếu CAST và CONVERT .


7

Có 3 phương pháp khác nhau tùy thuộc vào yêu cầu của tôi và phiên bản tôi đang sử dụng.

Đây là các phương pháp ..

1) Sử dụng Chuyển đổi

DECLARE @DateTime DATETIME = GETDATE();
--Using Convert
SELECT
    CONVERT(NVARCHAR, @DateTime,120) AS 'myDateTime'
    ,CONVERT(NVARCHAR(10), @DateTime, 120) AS 'myDate'
    ,RIGHT(CONVERT(NVARCHAR, @DateTime, 120),8) AS 'myTime'

2) Sử dụng Cast (SQL Server 2008 trở lên)

SELECT
    CAST(@DateTime AS DATETIME2) AS 'myDateTime'
    ,CAST(@DateTime AS DATETIME2(3)) AS 'myDateTimeWithPrecision'
    ,CAST(@DateTime AS DATE) AS 'myDate'
    ,CAST(@DateTime AS TIME) AS 'myTime'
    ,CAST(@DateTime AS TIME(3)) AS 'myTimeWithPrecision'

3) Sử dụng kiểu dữ liệu ký tự có độ dài cố định

DECLARE @myDateTime NVARCHAR(20) = CONVERT(NVARCHAR, @DateTime, 120);
DECLARE @myDate NVARCHAR(10) = CONVERT(NVARCHAR, @DateTime, 120);

SELECT
    @myDateTime AS 'myDateTime'
    ,@myDate AS 'myDate'

5

Ngoài các hàm CASTCONVERTtrong các câu trả lời trước, nếu bạn đang sử dụng SQL Server 2012 trở lên, bạn sử dụng hàm FORMAT để chuyển đổi DATETIMEkiểu dựa thành chuỗi.

Để chuyển đổi ngược lại, hãy sử dụng hàm đối lập PARSEhoặc TRYPARSEhàm.

Các kiểu định dạng dựa trên .NET (tương tự như các tùy chọn định dạng chuỗi của phương thức ToString ()) và có lợi thế là nhận thức được văn hóa. ví dụ.

DECLARE @DateTime DATETIME2 = SYSDATETIME();
DECLARE @StringResult1 NVARCHAR(100) = FORMAT(@DateTime, 'g') --without culture
DECLARE @StringResult2 NVARCHAR(100) = FORMAT(@DateTime, 'g', 'en-gb') 
SELECT @DateTime
SELECT @StringResult1, @StringResult2
SELECT PARSE(@StringResult1 AS DATETIME2)
SELECT PARSE(@StringResult2 AS DATETIME2 USING 'en-gb')

Các kết quả:

2015-06-17 06:20:09.1320951
6/17/2015 6:20 AM
17/06/2015 06:20
2015-06-17 06:20:00.0000000
2015-06-17 06:20:00.0000000

Tôi có thiếu thứ gì đó không hay vấn đề OP đã được giải quyết bằng FORMAT (<date var>, 'dd MMMM yyyy HH: mm: ss') hoặc bất kỳ định dạng ngày tùy chỉnh nào bạn cần ?!
Grim

@Grim bạn cũng có thể làm điều đó. Từ các tài liệuThe format argument must contain a valid .NET Framework format string, either as a standard format string (for example, "C" or "D"), or as a pattern of custom characters for dates and numeric values (for example, "MMMM DD, yyyy (dddd)")
g2server

Tôi nghĩ rằng bạn đang thực sự làm việc quá chăm chỉ ở đây. SQL Server có các chuỗi tương đương ngầm định cho DATETIME2. Những gì bạn thực sự đang làm ở đây là sử dụng chuyển đổi ngầm và sau đó định dạng chuỗi kết quả, không phải ngày giờ.
Jamie Marshall

@JamieMarshall ít nhiều. MSDN gợi ý:Use the FORMAT function for locale-aware formatting of date/time and number values as strings. For general data type conversions, use CAST or CONVERT.
g2server


1
SELECT CONVERT(varchar, @datetime, 103) --for UK Date format 'DD/MM/YYYY'

101 - US - MM / DD / YYYY

108 - Thời gian - HH: MI: SS

112 - Ngày - YYYYMMDD

121 - ODBC - YYYY-MM-DD HH: MI: SS.FFF

20 - ODBC - YYYY-MM-DD HH: MI: SS


1

Điều này đã được rất nhiều người trả lời, nhưng tôi cảm thấy như giải pháp đơn giản nhất đã bị bỏ rơi.

SQL SERVER (tôi tin rằng nó 2012+) có các chuỗi tương đương ngầm định cho DATETIME2 như được hiển thị ở đây

Xem phần "Định dạng ký tự chuỗi được hỗ trợ cho datetime2"

Để trả lời câu hỏi OP một cách rõ ràng:

DECLARE @myVar NCHAR(32)
DECLARE @myDt DATETIME2
SELECT @myVar = @GETDATE()
SELECT @myDt = @myVar
PRINT(@myVar)
PRINT(@myDt)

đầu ra:

Jan 23 2019 12:24PM             
2019-01-23 12:24:00.0000000

Lưu ý: Biến đầu tiên ( myVar) cũng đang giữ giá trị '2019-01-23 12:24:00.0000000'. Nó chỉ được định dạng Jan 23 2019 12:24PMdo định dạng mặc định được đặt cho SQL SERVER được gọi khi bạn sử dụng PRINT. Đừng vướng vào điều đó ở đây, chuỗi thực tế trong (myVer)='2019-01-23 12:24:00.0000000'


0

Hãy thử bên dưới:

DECLARE @myDateTime DATETIME
SET @myDateTime = '2013-02-02'

-- Convert to string now
SELECT LEFT(CONVERT(VARCHAR, @myDateTime, 120), 10)

1
Tốt !! Chúng ta có cần viết LEFT không?
Gaurav123

Có 10 ký tự đầu tiên, vì vậy nếu bạn cần nó nếu bạn chỉ muốn ngày.
ram4
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.