Cách chuyển đổi DateTime sang VarChar


303

Tôi đang làm việc với một truy vấn trong Sql Server 2005, nơi tôi cần chuyển đổi một giá trị trong DateTimebiến thành một varcharbiến có yyyy-mm-ddđịnh dạng (không có phần thời gian). Làm thế nào để làm điều đó?


1
CONVERT, xem tài liệu MSDN .
Jason Cohen

3
lưu ý rằng YYYY-MM-DD không rõ ràng, tùy thuộc vào cài đặt ngôn ngữ của bạn. tốt nhất để sử dụng tiêu chuẩn ISO YYYYMMDD, xem bài đăng trên blog này
Andy Irving

Câu trả lời:


262

Với máy chủ Microsoft Sql:

--
-- Create test case
--
DECLARE @myDateTime DATETIME
SET @myDateTime = '2008-05-03'

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

12
Đối với những người bạn có thể quan tâm, điều này sẽ hoạt động tốt hơn nếu bạn thay đổi VARCHAR thành CHAR. Xem bài đăng này ( stackoverflow.com/questions/59667/ - ) để biết thêm chi tiết. Về cơ bản, có 2 byte chi phí liên quan đến VARCHAR so với CHAR. Trong trường hợp này, chúng tôi biết rằng chuỗi của bạn sẽ luôn có 10 ký tự, vì vậy CHAR là phù hợp.
Will Ediger

1
Lưu ý bên lề, từ những gì tôi đã thấy, quá tệ, không có định dạng nào tôn vinh bất cứ điều gì DATEFORMAT được đặt thành, có thể có một cách khác.
Alex Nolasco

3
Có bất kỳ lý do để sử dụng LEFT(.., 10)thay vì CONVERT(CHAR(10), ...)? Ngoài ra, những người làm việc với các phiên bản SQL Server mới hơn 2005 (!) Nên xem câu trả lời của Zar Shardan đề xuất giải pháp dựa trên FORMAT(date_value, format_string)chức năng.
Nickolay

@Nickolay bên cạnh đó FORMAT()là quá chậm so vớiconvert(char(10),...)
abdul qayyum

380

Đây là một số sql thử nghiệm cho tất cả các phong cách.

DECLARE @now datetime
SET @now = GETDATE()
select convert(nvarchar(MAX), @now, 0) as output, 0 as style 
union select convert(nvarchar(MAX), @now, 1), 1
union select convert(nvarchar(MAX), @now, 2), 2
union select convert(nvarchar(MAX), @now, 3), 3
union select convert(nvarchar(MAX), @now, 4), 4
union select convert(nvarchar(MAX), @now, 5), 5
union select convert(nvarchar(MAX), @now, 6), 6
union select convert(nvarchar(MAX), @now, 7), 7
union select convert(nvarchar(MAX), @now, 8), 8
union select convert(nvarchar(MAX), @now, 9), 9
union select convert(nvarchar(MAX), @now, 10), 10
union select convert(nvarchar(MAX), @now, 11), 11
union select convert(nvarchar(MAX), @now, 12), 12
union select convert(nvarchar(MAX), @now, 13), 13
union select convert(nvarchar(MAX), @now, 14), 14
--15 to 19 not valid
union select convert(nvarchar(MAX), @now, 20), 20
union select convert(nvarchar(MAX), @now, 21), 21
union select convert(nvarchar(MAX), @now, 22), 22
union select convert(nvarchar(MAX), @now, 23), 23
union select convert(nvarchar(MAX), @now, 24), 24
union select convert(nvarchar(MAX), @now, 25), 25
--26 to 99 not valid
union select convert(nvarchar(MAX), @now, 100), 100
union select convert(nvarchar(MAX), @now, 101), 101
union select convert(nvarchar(MAX), @now, 102), 102
union select convert(nvarchar(MAX), @now, 103), 103
union select convert(nvarchar(MAX), @now, 104), 104
union select convert(nvarchar(MAX), @now, 105), 105
union select convert(nvarchar(MAX), @now, 106), 106
union select convert(nvarchar(MAX), @now, 107), 107
union select convert(nvarchar(MAX), @now, 108), 108
union select convert(nvarchar(MAX), @now, 109), 109
union select convert(nvarchar(MAX), @now, 110), 110
union select convert(nvarchar(MAX), @now, 111), 111
union select convert(nvarchar(MAX), @now, 112), 112
union select convert(nvarchar(MAX), @now, 113), 113
union select convert(nvarchar(MAX), @now, 114), 114
union select convert(nvarchar(MAX), @now, 120), 120
union select convert(nvarchar(MAX), @now, 121), 121
--122 to 125 not valid
union select convert(nvarchar(MAX), @now, 126), 126
union select convert(nvarchar(MAX), @now, 127), 127
--128, 129 not valid
union select convert(nvarchar(MAX), @now, 130), 130
union select convert(nvarchar(MAX), @now, 131), 131
--132 not valid
order BY style

Đây là kết quả

output                   style
Apr 28 2014  9:31AM          0
04/28/14                     1
14.04.28                     2
28/04/14                     3
28.04.14                     4
28-04-14                     5
28 Apr 14                    6
Apr 28, 14                   7
09:31:28                     8
Apr 28 2014  9:31:28:580AM   9
04-28-14                     10
14/04/28                     11
140428                       12
28 Apr 2014 09:31:28:580     13
09:31:28:580                 14
2014-04-28 09:31:28          20
2014-04-28 09:31:28.580      21
04/28/14  9:31:28 AM         22
2014-04-28                   23
09:31:28                     24
2014-04-28 09:31:28.580      25
Apr 28 2014  9:31AM          100
04/28/2014                   101
2014.04.28                   102
28/04/2014                   103
28.04.2014                   104
28-04-2014                   105
28 Apr 2014                  106
Apr 28, 2014                 107
09:31:28                     108
Apr 28 2014  9:31:28:580AM   109
04-28-2014                   110
2014/04/28                   111
20140428                     112
28 Apr 2014 09:31:28:580     113
09:31:28:580                 114
2014-04-28 09:31:28          120
2014-04-28 09:31:28.580      121
2014-04-28T09:31:28.580      126
2014-04-28T09:31:28.580      127
28 جمادى الثانية 1435  9:31:28:580AM    130
28/06/1435  9:31:28:580AM    131

Làm nvarchar(max)ngắn hơn để cắt thời gian. Ví dụ:

select convert(nvarchar(11), GETDATE(), 0)
union select convert(nvarchar(max), GETDATE(), 0)

đầu ra:

May 18 2018
May 18 2018  9:57AM

Ở đây Đôi khi chúng ta muốn dd-mmhay jun - 28. Có lựa chọn nào không ??
Rock

Hoạt động cho SQL Server 2005 vì vậy điều này rất tốt cho những người trong chúng ta vẫn không may hợp tác với các hệ thống cũ hơn. Nâng cấp lên 2014 sớm, vui mừng!
chứng khó đọc

Tôi muốn định dạng gần 101 - 101 = 28/11/2014, tôi muốn không có số 0 trong tháng, đầu ra 4/11/2014, có áp dụng được không?
abdelqader ahmed

1
Không phải là định danh múi giờ Z bị thiếu trong kiểu 127.
Atishay

@Atishay "chỉ được hỗ trợ khi truyền từ dữ liệu ký tự sang datetime hoặc smalldatetime". Xem chú thích 6 và 7 tại docs.microsoft.com/de-de/sql/t-sql/fifts/ Kẻ
Colin



9

Bạn có thể sử dụng DATEPART(DATEPART, VARIABLE). Ví dụ:

DECLARE @DAY INT 
DECLARE @MONTH INT
DECLARE @YEAR INT
DECLARE @DATE DATETIME
@DATE = GETDATE()
SELECT @DAY = DATEPART(DAY,@DATE)
SELECT @MONTH = DATEPART(MONTH,@DATE)
SELECT @YEAR = DATEPART(YEAR,@DATE)


6

- Điều này cung cấp cho bạn thời gian là 0 ở định dạng 'yyyy-mm-dd 00: 00: 00.000'


SELECT CAST( CONVERT(VARCHAR, GETDATE(), 101) AS DATETIME) ; 




3
declare @dt datetime

set @dt = getdate()

select convert(char(10),@dt,120) 

Tôi đã cố định độ dài dữ liệu char(10)như bạn muốn một định dạng chuỗi cụ thể.


2

OP đề cập đến định dạng datetime . Đối với tôi, phần thời gian cản trở.
Tôi nghĩ rằng sẽ sạch hơn một chút để loại bỏ phần thời gian (bằng cách truyền datetime đến ngày) trước khi định dạng.

convert( varchar(10), convert( date, @yourDate ) , 111 )

2

Đây là cách tôi làm điều đó: CONVERT(NVARCHAR(10), DATE1, 103) )


2

Bạn có thể chuyển đổi ngày của mình theo nhiều định dạng, cú pháp rất dễ sử dụng:

CONVERT('TheTypeYouWant', 'TheDateToConvert', 'TheCodeForFormating' * )
CONVERT(NVARCHAR(10), DATE_OF_DAY, 103) => 15/09/2016
  • Mã là một số nguyên, ở đây 3 là công thức thứ ba không có thế kỷ, nếu bạn muốn thế kỷ chỉ cần thay đổi mã thành 103.

Trong trường hợp của bạn , tôi vừa chuyển đổi và hạn chế kích thước bởi nvarchar (10) như thế này:

CONVERT(NVARCHAR(10), MY_DATE_TIME, 120) => 2016-09-15

Xem thêm tại: http://www.w3schools.com/sql/func_convert.asp

Một giải pháp khác (nếu ngày của bạn là Ngày tháng) là một CAST đơn giản :

CAST(MY_DATE_TIME as DATE) => 2016-09-15

2

Hãy thử SQL này:

select REPLACE(CONVERT(VARCHAR(24),GETDATE(),103),'/','_') + '_'+ 
       REPLACE(CONVERT(VARCHAR(24),GETDATE(),114),':','_')

2

Đối với SQL Server 2008+ Bạn có thể sử dụng CONVERT và FORMAT cùng nhau.

Ví dụ: đối với dấu thời gian theo phong cách châu Âu (ví dụ Đức):

CONVERT(VARCHAR, FORMAT(GETDATE(), 'dd.MM.yyyy HH:mm:ss', 'de-DE'))

1

Bạn không nói cơ sở dữ liệu nào, nhưng với mysql ở đây là một cách dễ dàng để lấy ngày từ dấu thời gian (và chuyển đổi loại varchar sẽ tự động xảy ra):

mysql> select date(now());
+-------------+
| date(now()) |
+-------------+
| 2008-09-16  | 
+-------------+
1 row in set (0.00 sec)

1
Kiểm tra lại: anh ta chỉ định máy chủ sql thông qua một thẻ.
Joel Coehoorn

1

Cách ngắn nhất và đơn giản nhất là:

DECLARE @now AS DATETIME = GETDATE()

SELECT CONVERT(VARCHAR, @now, 23)

1
DECLARE @DateTime DATETIME
SET @DateTime = '2018-11-23 10:03:23'
SELECT CONVERT(VARCHAR(100),@DateTime,121 )


0

Viết hàm

CREATE FUNCTION dbo.TO_SAP_DATETIME(@input datetime)
RETURNS VARCHAR(14)
AS BEGIN
    DECLARE @ret VARCHAR(14)
    SET @ret = COALESCE(SUBSTRING(REPLACE(REPLACE(REPLACE(CONVERT(VARCHAR(26), @input, 25),'-',''),' ',''),':',''),1,14),'00000000000000');
    RETURN @ret
END

0
select REPLACE(CONVERT(VARCHAR, FORMAT(GETDATE(), N'dd/MM/yyyy hh:mm:ss tt')),'.', '/')

sẽ cho 05/05/2020 10:41:05 AMkết quả


-3

Bạn không nói ngôn ngữ nào nhưng tôi giả sử C#/.NETvì nó có DateTimekiểu dữ liệu riêng. Trong trường hợp đó, chỉ cần chuyển đổi nó bằng ToStringphương thức và sử dụng một chỉ định định dạng, chẳng hạn như:

DateTime d = DateTime.Today;
string result = d.ToString("yyyy-MM-dd");

Tuy nhiên, tôi sẽ thận trọng không sử dụng điều này trong truy vấn cơ sở dữ liệu hoặc nối vào câu lệnh SQL. Cơ sở dữ liệu yêu cầu một chuỗi định dạng cụ thể được sử dụng. Bạn nên loại bỏ phần thời gian và sử dụng DateTime làm tham số SQL nếu đó là điều bạn đang cố gắng thực hiện.


Trong câu hỏi, nó đã đề cập "Tôi đang làm việc với một truy vấn trong Sql Server 2005".
InkHeart

4
@InkHeart và tất cả những người bỏ phiếu - Câu trả lời này đã được đăng vào năm 2008. Nếu bạn kiểm tra lịch sử chỉnh sửa cho câu hỏi ban đầu thì không có thẻ và / hoặc bất kỳ thông tin nào liên quan đến công nghệ.
GSazheniuk
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.