如何在T-SQL中将日期时间转换为字符串

114
我很惊讶在这里找不到这个问题。我有一个日期时间变量,我想将其转换为字符串,以便将其附加到另一个字符串中。我希望它的格式可以轻松地转换回日期时间。我该怎么做?(我想要日期部分和时间部分。)

1
@TonyHopkinson 我也得到了很多搜索结果,但它们似乎都是将另一种方式进行转换。或者需要更复杂的东西。 - cja
4
始终是第一道防线。请键入“Convert”,双击以突出显示,按Shift + F1 ... - Eric J. Price
10个回答

184
以下查询将获取当前日期时间并转换为字符串,格式如下:
yyyy-mm-dd hh:mm:ss(24h)
SELECT convert(varchar(25), getdate(), 120) 

63
我仍然无法接受一个事实,那就是为了得到正确的格式,你必须传递任意数字。 - cja
5
@cja,我完全理解你的惊讶。我想提供一个字符串,比如yyddss,以获得我想要的确切格式。这可能是由于技术或历史原因造成的。但仍然非常令人惊讶和烦人。 - Konrad Viltersten
3
感谢您的快速修复,但在您的答案中,您将月份编码为分钟,正确的格式应该是 yyyy-MM-dd hh:mm:ss 而不是 yyyy-mm-dd hh:mm:ss。请参考。 - Tom Martin
1
虽然这是老帖子了,但我刚看到它。在使用DateTimeOffSet时,请确保将varchar长度调整为您想要的输出外观。对于我来说,我不想要时区,因此必须使用SELECT convert(varchar(19), sysdatetimeoffset(), 120) - RoLYroLLs

37
有很多不同的方法可以将一个日期时间(datetime)转换为字符串。这是其中一种方法:
SELECT convert(varchar(25), getdate(), 121)  – yyyy-mm-dd hh:mm:ss.mmm

看看演示
这里有一个网站,列出了所有的转换方式: 如何在SQL Server中格式化日期和时间

13

除了之前回答中提到的 CASTCONVERT 函数外,如果您正在使用 SQL Server 2012 及以上版本,则可以使用FORMAT函数将基于DATETIME类型的数据转换为字符串。

要进行转换,请使用相反的 PARSETRYPARSE 函数。

格式样式基于.NET(类似于ToString() 方法的字符串格式选项),并具有文化意识优势。例如:

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')

结果:

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

1
我是否漏掉了什么,或者OP的问题已经通过FORMAT(<date var>,'dd MMMM yyyy HH:mm:ss')或任何您需要的自定义日期格式解决了?! - Grim
2
@Grim,你也可以这样做。从文档中得知:format参数必须包含一个有效的.NET Framework格式字符串,可以是标准格式字符串(例如,“C”或“D”),也可以是日期和数字值的自定义字符模式(例如,“MMMM DD, yyyy (dddd)”)。 - g2server
1
我认为你在这里实际上工作过度了。SQL Server对于DATETIME2有隐式的字符串等效项。你实际上正在利用隐式转换,然后格式化生成的字符串,而不是日期时间。 - Jamie Marshall
1
@JamieMarshall 差不多。MSDN 建议:使用 FORMAT 函数以区域设置方式将日期/时间和数字值格式化为字符串。对于通用数据类型转换,请使用 CAST 或 CONVERT。 - g2server

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

101 - 美国格式日期 - MM/DD/YYYY

108 - 时间 - HH:MI:SS

112 - 日期 - YYYYMMDD

121 - ODBC标准时间 - YYYY-MM-DD HH:MI:SS.FFF

20 - ODBC标准时间 - YYYY-MM-DD HH:MI:SS


10

根据我的需求和正在使用的版本,有三种不同的方法。

以下是这些方法:

1)使用Convert

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) 使用 Cast(SQL Server 2008 及更高版本)

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) 使用固定长度的字符数据类型

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

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

8
您可以使用Microsoft SQL Server中的convert语句将日期转换为字符串。语法示例如下:
SELECT convert(varchar(20), getdate(), 120)

上面的代码会返回当前日期和时间,格式为YYYY-MM-DD HH:MM:SS,采用24小时制。您可以更改语句末尾的数字,以便更改返回字符串的格式。可以在MSDN的CAST和CONVERT参考部分中找到这些代码的列表。

2

2

请尝试以下内容:

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

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

2
好的!! 我们需要写LEFT吗? - Gaurav123
1
获取前10个字符,所以如果你只需要日期,就不需要它。 - ram4nd

2
这个问题已经被很多人回答了,但我感觉最简单的解决方案被忽略了。
SQL SERVER(我相信是2012+版)有DATETIME2的隐式字符串等效形式,如此处所示:这里 查看“datetime2支持的字符串文字格式”部分。
直接回答OP的问题:
DECLARE @myVar NCHAR(32)
DECLARE @myDt DATETIME2
SELECT @myVar = @GETDATE()
SELECT @myDt = @myVar
PRINT(@myVar)
PRINT(@myDt)

输出:

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

注意: 第一个变量(myVar)实际上也保存了值'2019-01-23 12:24:00.0000000'。由于SQL SERVER默认格式设置会在使用PRINT时调用,所以它会被格式化为Jan 23 2019 12:24PM。请不要被这个绊倒,(myVer)中的实际字符串='2019-01-23 12:24:00.0000000'

1
在我的存储过程中,类似于这样的操作起到了作用。
StartingDate 转换为 varchar(10) 类型,并且别名为 'StartingDate'。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接