SQL Server将Varchar转换为Datetime

53

我有这样的日期格式:2011-09-28 18:01:00(字符串类型),我想将其转换为格式为28-09-2011 18:01:00的datetime类型。我该怎么做?


@Quassnoi,可能是微软SQL Server,但我不能确定,许多关系型数据库管理系统都可以成为SQL服务器 ;) - Hajo
3
你的问题似乎有点矛盾。你是想将一个VARCHAR转换成DATETIME,还是只是想重新排列VARCHAR的格式,但仍以VARCHAR的形式保留它? - MatBailie
2
日期时间列没有人类可读的格式。 - Joel Coehoorn
我想将其转换为日期时间并将 yyyy-mm-dd 更改为 dd-mm-yyyy。 - HaOx
3
“DATETIME” 数据类型没有格式。它不是字符串,而是日期和时间的二进制表示形式。你想要一个“DATETIME”数据类型,还是想要一个“VARCHAR”数据类型,并重新排列日期的部分? - MatBailie
9个回答

85
SELECT CONVERT(Datetime, '2011-09-28 18:01:00', 120) -- to convert it to Datetime

SELECT CONVERT( VARCHAR(30), @date ,105) -- italian format [28-09-2011 18:01:00]
+ ' ' + SELECT CONVERT( VARCHAR(30), @date ,108 ) -- full date [with time/minutes/sec]

只需记住datetime变量没有格式。如果您想以特定格式显示它,必须将其转换为varchar。 - zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
1
日期时间没有格式,但您必须指定如何重现文本(日期/月份在哪里...)。 - Zyku

12
就像这样。
DECLARE @date DATETIME
SET @date = '2011-09-28 18:01:00'
select convert(varchar, @date,105) + ' ' + convert(varchar, @date,108)

我想将其转换为日期时间并更改为此格式28-09-2011 18:01:00。 - 您在哪里使用新格式? - MatBailie
这个可以运行,但是没有必要进行四次转换。看一下Diego的答案:SELECT CONVERT(VARCHAR(30), GETDATE(), 105) - daniloquio
是的,Diego的答案需要将varchar(10)更改为(30)。然后它就可以工作了。 - daniloquio
@daniloquio,那不是真的。 - zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
1
@daniloquio 是的,我这样做了,但 '2011-09-28 18:01:00' 是一个 varchar 类型,所以你正在将一个 varchar 转换为 varchar,这就是为什么它看起来正确的原因。 - zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
显示剩余5条评论

12

这个 网站显示了几种日期格式选项。

例如:

SELECT CONVERT(VARCHAR(10), GETDATE(), 105) 

5
除了105没有包含时间部分之外,而且该问题的起点是一个字符串而不是日期时间。这确实有帮助,但我认为这并不是一个完整的答案。 - MatBailie
2
谢谢你们的评论。我只是想指引他正确的方向,所以才写了“示例”。 - Diego

7

你的回答似乎只是简单地重复了现有答案中给出的信息。因此,我已经删除了你的回答。如果你想在你的回答中添加新的信息,请编辑你的帖子,然后标记它以取消删除。 - Matt

4
尝试以下操作:
select Convert(Varchar(50),yourcolumn,103) as Converted_Date from yourtbl

4
您可以这样做,但它会保留为 varchar 类型。
declare @s varchar(50)

set @s = '2011-09-28 18:01:00'

select convert(varchar, cast(@s as datetime), 105) + RIGHT(@s, 9)

或者

select convert(varchar(20), @s, 105)

3

如前所述,datetime没有格式/字符串表示形式。

您可以通过一些格式设置更改字符串输出。

要将字符串转换为datetime:

declare @date nvarchar(25) 
set @date = '2011-09-28 18:01:00' 

-- To datetime datatype
SELECT CONVERT(datetime, @date)

提供:

-----------------------
2011-09-28 18:01:00.000

(1 row(s) affected)

要将其转换为您想要的字符串:
-- To VARCHAR of your desired format
SELECT CONVERT(VARCHAR(10), CONVERT(datetime, @date), 105) +' '+ CONVERT(VARCHAR(8), CONVERT(datetime, @date), 108)

给出:

-------------------
28-09-2011 18:01:00

(1 row(s) affected)

它对于以下格式 2023-06-14 00:00:00.00000 不起作用。 - Sanjay Dwivedi
以下格式2023-06-14 00:00:00.00000无法正常工作。 - undefined

3
SELECT CONVERT(VARCHAR(10), GETDATE(), 105) + ' ' + CONVERT(VARCHAR(10), GETDATE(), 108)

0

我厌倦了不同的转换谷歌搜索,最终得到了这个实用函数,可以扩展新的变体。

CREATE FUNCTION [dbo].[ParseDatetime] (
    @INPUT nvarchar(255),
    @FORMAT nvarchar(255)
)
RETURNS datetime

AS 
BEGIN 


DECLARE @TimePart NVARCHAR(255)
DECLARE @DatePart NVARCHAR(255)
DECLARE @DayPart NVARCHAR(255)
DECLARE @ExDayPart NVARCHAR(255)
DECLARE @MonthPart NVARCHAR(255)
DECLARE @YearPart NVARCHAR(255)
DECLARE @Date DATETIME
--DECLARE @INPUTSTRING NVARCHAR(255)
--SET @INPUTSTRING = '20-10-2019 00:00:00'

--SET @FORMAT = 'D-M-YYYY HH:MM:SS'
IF(@FORMAT = 'D-M-YYYY HH:MM:SS')
BEGIN
    SET @TimePart = RIGHT(@INPUT,LEN(@INPUT)-CHARINDEX(' ',@INPUT))
    SET @DatePart = LEFT(@INPUT,CHARINDEX(' ',@INPUT))
    SET @DayPart = LEFT(@DatePart,charindex('-',@DatePart)-1)
    SET @ExDayPart = RIGHT(@DatePart,LEN(@DatePart)-charindex('-',@DatePart)+1)
    SET @MonthPart = left(@ExDayPart ,charindex('-',@ExDayPart )-1)
    SET @YearPart = right(@ExDayPart ,LEN(@ExDayPart )-charindex('-',@ExDayPart )+1)
    SET @Date = DATEFROMPARTS(@YearPart,@MonthPart,@DayPart) 

END

IF(@FORMAT = 'YYYY-MM-DD')
BEGIN
    SET @DayPart = RIGHT(@INPUT,2)
    SET @MonthPart = RIGHT(left(@INPUT,7),2)
    SET @YearPart = LEFT(@INPUT,4)
    SET @Date = DATEFROMPARTS(@YearPart,@MonthPart,@DayPart) 

END

IF(@FORMAT = 'EXCEL_DAYS_SINCE_1900')
BEGIN
--DECLARE @INPUT NVARCHAR(255)
--SET @INPUT = ' 43554' 
    SET @Date = Dateadd(day,CAST(@INPUT AS INT),datefromparts(1900,1,1))
END


RETURN @Date
END
GO

使用方法如下:

SELECT
[DateAsDate] = dbo.[ParseDateTime]([DateAsString], 'YYYY-MM-DD')
FROM [tablename]

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