如何将(月份名称,年份)转换为日期时间格式

问题描述 投票:2回答:5

我正在编写一个函数,它具有参数@terminationMonthYear,数据类型为nvarchar,

我需要将上面的参数转换为datetime。

例如:如果我通过(2013年1月)。我需要它在sql server中使用datetime数据类型转换为特定月份'2013-01-01'的第一天。

提前致谢

sql sql-server sql-server-2008
5个回答
0
投票

试试这个(在这个例子中,@ Date表示@terminationMonthYear):

DECLARE @Date NVARCHAR(50) = 'February ,2013'
DECLARE @Month NVARCHAR(50) = LTRIM(RTRIM(LEFT(@Date, PATINDEX('%,%',@Date)-1)))
DECLARE @Year NVARCHAR(50) = LTRIM(RTRIM(RIGHT(@Date, LEN(@Date) - PATINDEX('%,%',@Date))))
SELECT CAST(@Month + ' 01, ' + @Year AS DATE)

或者,如果您的输入参数包含(),请尝试以下操作:

DECLARE @Date NVARCHAR(50) = '(February ,2013)'
   SET @Date = REPLACE(REPLACE(@Date,'(',''),')','')
DECLARE @Month NVARCHAR(50) = LTRIM(RTRIM(LEFT(@Date, PATINDEX('%,%',@Date)-1)))
DECLARE @Year NVARCHAR(50) = LTRIM(RTRIM(RIGHT(@Date, LEN(@Date) - PATINDEX('%,%',@Date))))
SELECT CAST(@Month + ' 01, ' + @Year AS DATE)

无论您是传递完整的月份名称还是3个字母的缩写(例如3月份的Mar),这都会有效。此外,您提到要将其转换为DATETIME格式,但2013-01-01是DATE(无时间组件)。如果你想要一个时间组件,你可以将最后一行中的CAST更改为“... AS DATETIME”,它将添加一个时间组件(尽管它将全部为0)。


1
投票

如果你通过“2013年1月”它将工作

@MonthName  Varchar(50)
Declare @FromDate datetime, @ToDate datetime
Select @FromDate = Convert(Datetime,@MonthName), @ToDate = DateAdd(d,-1,DateAdd(m,1,Convert(Datetime,@MonthName)))

0
投票

如果您知道您的格式总是“月,年”,您可以通过用,替换01,来执行以下操作:

DECLARE @input VARCHAR(100)
SET @input = 'January, 2014'
DECLARE @newinput VARCHAR(100) 
SET @newinput = REPLACE(@input, ',', ' 01,')

SELECT CAST(@newinput AS DATETIME)

或者,如果您只想要一个班轮版本:

SELECT CAST(REPLACE(@input, ',', ' 01,') AS DATETIME)

更简单,但你需要确保格式输入是正确的,但你可能会遇到几乎任何类型的解析解决方案的问题。

编辑:评论是你可能需要摆脱括号也很容易:

SELECT CAST(REPLACE(REPLACE(REPLACE(@input, ',', ' 01,'), ')', ''), '(', '') AS DATETIME)

0
投票

convert()函数将'01 -January-2013'转换为有效日期。您只需在字符串的开头添加01并将逗号变为破折号:

convert(date, '01-' + replace(@terminationMonthYear, ',', '-')

0
投票

SQL CAST功能非常通用:

SELECT CAST('January,2013' AS DATETIME)

返回'2013-01-01 00:00:00.000',我相信这正是您所寻找的。时间信息似乎是多余的,因此请考虑将其转换为DATE。

© www.soinside.com 2019 - 2024. All rights reserved.