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


89

令我惊讶的是现在还不能找到这个问题。

我有一个日期时间var,我想将其转换为字符串,以便可以将其附加到另一个字符串。我想要一种可以轻松转换回日期时间的格式。

我怎样才能做到这一点?

(我想要日期部分和时间部分。)


@TonyHopkinson我也收到了很多热门歌曲,但它们似乎都在转变。或者想要更复杂的东西。
cja

3
键入Convert,双击以突出显示,然后按Shift + F1 ...始终是第一道防线。
Eric J. Price

Answers:


154

以下查询将获取当前日期时间并转换为字符串。具有以下格式
yyyy-mm-dd hh:mm:ss(24h)

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

47
我仍然无法克服这样一个事实,即您必须传递任意数字才能获得正确的格式
cja 2013年

4
@cja我完全分享您的惊喜。我想提供一个字符串,例如yyddss,以获得我想要的确切格式。这可能是出于技术或历史原因。但仍然-非常surpriannoying。
Konrad Viltersten 2015年

2
感谢快速修复,但您在回答时将月份编码为分钟,yyyy-MM-dd hh:mm:ss不是yyyy-mm-dd hh:mm:ss
Tom Martin

尽管这很旧,但我还是碰到了这个话题。使用时DateTimeOffSet,请确保将varchar长度调整为所需的结果。对我来说,我不希望时区,所以我不得不使用SELECT convert(varchar(19), sysdatetimeoffset(), 120)
RoLYroLLs


7

您可以使用convertMicrosoft SQL Server中的语句将日期转换为字符串。使用的语法示例为:

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

上面的代码将以YYYY-MM-DD HH:MM:SS24小时制的格式返回当前日期和时间的字符串。

您可以将语句末尾的数字更改为许多将更改返回的字符串格式的数字之一。这些代码的列表可以在MAST的CAST和CONVERT参考部分中找到。


6

有3种不同的方法,具体取决于我的要求和所使用的版本。

这里是方法。

1)使用转换

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'

4

除了前面的答案中的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

我是否缺少某些东西,或者使用FORMAT(<date var>,'dd MMMM yyyy HH:mm:ss')或您需要的任何自定义日期格式解决了OPs问题?
Grim

@Grim您也可以这样做。来自文档The 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

我认为您实际上在这里太努力了。SQL Server具有DATETIME2的隐式字符串等效项。您实际上在这里使用的是隐式转换,然后格式化结果字符串,而不是日期时间。
杰米·马歇尔

@JamieMarshall或多或少。MSDN建议: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

许多人都回答了这个问题,但是我觉得最简单的解决方案已经被遗漏了。

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'Jan 23 2019 12:24PM由于使用时会调用SQL SERVER的默认格式,因此它只是被格式化PRINT。不要因此而被绊倒,(myVer)=中的实际字符串'2019-01-23 12:24:00.0000000'


0

请尝试以下方法:

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

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

1
好!我们还需要写LEFT吗?
Gaurav123

需要10个第一个字符,所以如果您只想要日期,则需要它。
ram4nd
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.