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 DateTime
biến thành một varchar
biế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 đó?
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 DateTime
biến thành một varchar
biế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 đó?
Câu trả lời:
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)
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.
FORMAT()
là quá chậm so vớiconvert(char(10),...)
Đâ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
dd-mm
hay jun - 28
. Có lựa chọn nào không ??
Hãy thử như sau:
CONVERT(varchar(10), [MyDateTimecolumn], 20)
Đối với một ngày đầy đủ và không chỉ ngày làm:
CONVERT(varchar(23), [MyDateTimecolumn], 121)
Xem trang này để chuyển đổi kiểu:
http://msdn.microsoft.com/en-us/l Library / ms187928.aspx
HOẶC
SQL Server CONVERT () Hàm
SQL Server 2012 có chức năng mới, FORMAT: http://msdn.microsoft.com/en-us/l Library / ee634924.aspx
và bạn có thể sử dụng chuỗi định dạng thời gian ngày tùy chỉnh: http://msdn.microsoft.com/en-us/l Library / ee634398.aspx
Các trang này ngụ ý nó cũng có sẵn trên SQL2008R2, nhưng tôi không có tiện ích để kiểm tra nếu đó là trường hợp.
Ví dụ sử dụng (datetime Úc):
FORMAT(VALUE,'dd/MM/yyyy h:mm:ss tt')
Hoặc Cast
hay Convert
:
Cú pháp cho CAST
:
CAST ( expression AS data_type [ (length ) ])
Cú pháp cho CONVERT
:
CONVERT ( data_type [ ( length ) ] , expression [ , style ] )
http://msdn.microsoft.com/en-us/l Library / ms187928.aspx
Trên thực tế vì bạn đã yêu cầu một định dạng cụ thể:
REPLACE(CONVERT(varchar(10), Date, 102), '.', '-')
Với máy chủ Microsoft SQL:
Sử dụng Cú pháp cho CHUYỂN ĐỔI:
CONVERT ( data_type [ ( length ) ] , expression [ , style ] )
Thí dụ:
SELECT CONVERT(varchar,d.dateValue,1-9)
Đối với kiểu bạn có thể tìm thêm thông tin ở đây: MSDN - Truyền và chuyển đổi (Transact-SQL) .
Hãy thử như sau:
CONVERT(VARCHAR(10),GetDate(),102)
Sau đó, bạn sẽ cần phải thay thế "." với "-".
Đây là một trang web giúp http://www.mssqltips.com/tip.asp?tip=1145
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ể.
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
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
Đố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'))
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)
Cách ngắn nhất và đơn giản nhất là:
DECLARE @now AS DATETIME = GETDATE()
SELECT CONVERT(VARCHAR, @now, 23)
select REPLACE(CONVERT(VARCHAR, FORMAT(GETDATE(), N'dd/MM/yyyy hh:mm:ss tt')),'.', '/')
sẽ cho 05/05/2020 10:41:05 AM
kết quả
Bạn không nói ngôn ngữ nào nhưng tôi giả sử C#/.NET
vì nó có DateTime
kiểu dữ liệu riêng. Trong trường hợp đó, chỉ cần chuyển đổi nó bằng ToString
phươ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.
CONVERT
, xem tài liệu MSDN .