我在mysql中创建了存储过程,用于字符串到日期时间的转换。在我的应用程序数据是动态的我是指用户导入CSV文件所以只有用户知道数据格式。所以用户指定数据格式,如DD / MM / YYYY或YYYY-MM-DD或数据包含的任何分隔符。我解析这个日期格式并转换成mysql字符串到日期转换格式,如%d /%m /%Y并使用STR_TO_DATE函数。 一切都很完美。
现在我想在sql server中实现相同的功能,但是在sql server中,每个日期格式都有一些数字,如下例所示。
SELECT convert(datetime, 'Oct 23 2012 11:01AM', 100) -- mon dd yyyy hh:mmAM (or PM)
所以在sql server中,对于某些日期格式,某些数字是固定的。 在我的情况下,我想使日期格式动态,以便用户可以使用任何分隔符输入任何日期格式。
所以任何人都知道如何在sql server中实现相同的字符串到日期时间转换功能,就像我已经实现的mysql一样,并解释如上。
提前致谢。
答案 0 :(得分:1)
convert
函数中的thirt参数是可选的。如果省略它,则可以使用它来转换不同的日期格式。这些都给出了相同的结果(至少我的文化设置):
select convert(datetime, 'Oct 23 2012 11:01AM')
union all
select convert(datetime, '2012-10-23 11:01')
union all
select convert(datetime, '2012/10/23 11:01')
union all
select convert(datetime, '10/23/2012 11:01')
union all
select convert(datetime, '2012 Oct 23 11:01')
请注意,当前文化设置将用于确定某些格式。格式10/23/2012
是我的设置的有效日期,但不是23/10/2012
。您的设置可能与情况相反。
答案 1 :(得分:0)
我很遗憾地说,convert
使用表示日期格式的数字是SQL Server中使用存储过程创建自己的实现的唯一可能性。
您可以选择创建一个包含各种日期格式的表格,并将其与此语句连接以获得正确的数字,但这听起来不像是我真正的解决方案。
唯一的解决办法似乎就是接受这个。
答案 2 :(得分:0)
我找到了一个可以帮助你完成所需内容的SQL服务器功能。
CREATE FUNCTION dbo.fnFormatDate (@Datetime DATETIME, @FormatMask VARCHAR(32))
RETURNS VARCHAR(32)
AS
BEGIN
DECLARE @StringDate VARCHAR(32)
SET @StringDate = @FormatMask
IF (CHARINDEX (‘YYYY’,@StringDate) > 0)
SET @StringDate = REPLACE(@StringDate, ‘YYYY’,
DATENAME(YY, @Datetime))
IF (CHARINDEX (‘YY’,@StringDate) > 0)
SET @StringDate = REPLACE(@StringDate, ‘YY’,
RIGHT(DATENAME(YY, @Datetime),2))
IF (CHARINDEX (‘Month’,@StringDate) > 0)
SET @StringDate = REPLACE(@StringDate, ‘Month’,
DATENAME(MM, @Datetime))
IF (CHARINDEX (‘MON’,@StringDate COLLATE SQL_Latin1_General_CP1_CS_AS)>0)
SET @StringDate = REPLACE(@StringDate, ‘MON’,
LEFT(UPPER(DATENAME(MM, @Datetime)),3))
IF (CHARINDEX (‘Mon’,@StringDate) > 0)
SET @StringDate = REPLACE(@StringDate, ‘Mon’,
LEFT(DATENAME(MM, @Datetime),3))
IF (CHARINDEX (‘MM’,@StringDate) > 0)
SET @StringDate = REPLACE(@StringDate, ‘MM’,
RIGHT(’0′+CONVERT(VARCHAR,DATEPART(MM, @Datetime)),2))
IF (CHARINDEX (‘M’,@StringDate) > 0)
SET @StringDate = REPLACE(@StringDate, ‘M’,
CONVERT(VARCHAR,DATEPART(MM, @Datetime)))
IF (CHARINDEX (‘DD’,@StringDate) > 0)
SET @StringDate = REPLACE(@StringDate, ‘DD’,
RIGHT(’0′+DATENAME(DD, @Datetime),2))
IF (CHARINDEX (‘D’,@StringDate) > 0)
SET @StringDate = REPLACE(@StringDate, ‘D’,
DATENAME(DD, @Datetime))
RETURN @StringDate
END
GO
该功能的用法如下:
SELECT dbo.fnFormatDate (getdate(), ‘MM/DD/YYYY’) – 01/03/2012
SELECT dbo.fnFormatDate (getdate(), ‘DD/MM/YYYY’) – 03/01/2012
SELECT dbo.fnFormatDate (getdate(), ‘M/DD/YYYY’) – 1/03/2012
SELECT dbo.fnFormatDate (getdate(), ‘M/D/YYYY’) – 1/3/2012
SELECT dbo.fnFormatDate (getdate(), ‘M/D/YY’) – 1/3/12
SELECT dbo.fnFormatDate (getdate(), ‘MM/DD/YY’) – 01/03/12
SELECT dbo.fnFormatDate (getdate(), ‘MON DD, YYYY’) – JAN 03, 2012
SELECT dbo.fnFormatDate (getdate(), ‘Mon DD, YYYY’) – Jan 03, 2012
SELECT dbo.fnFormatDate (getdate(), ‘Month DD, YYYY’) – January 03, 2012
SELECT dbo.fnFormatDate (getdate(), ‘YYYY/MM/DD’) – 2012/01/03
SELECT dbo.fnFormatDate (getdate(), ‘YYYYMMDD’) – 20120103
SELECT dbo.fnFormatDate (getdate(), ‘YYYY-MM-DD’) – 2012-01-03
– CURRENT_TIMESTAMP returns current system date and time in standard internal format
SELECT dbo.fnFormatDate (CURRENT_TIMESTAMP,‘YY.MM.DD’) – 12.01.03
当然你可以扩展这个功能,这样它也可以处理时间
参考:
答案 3 :(得分:0)
在sqlserver中转换函数为您提供格式。
以下是同样的问题: -
Sql Server string to date conversion
SQL Server convert string to datetime
您没有编写sqlserver版本:如果是2012,请检查link-
http://www.databasejournal.com/features/mssql/the-format-function-in-sql-server-2012.html
您可以使用ISDATE函数来检查该字符串是否为有效的日期时间值。
创建一个sp,而不是一个函数,因为它不处理try ... catch .. block
create procedure dbo.strToDatefunction
(
@dateString varchar(50)
)
as
BEGIN
Declare @ConvertDateInMDYFormat datetime
set dateformat dmy
/*now start arbitraory string to convert and handle in try catch , so next format apply to convert*/
BEGIN TRY
set @ConvertDateInMDYFormat = (select @dateString,convert(varchar,@dateString,101),101,'mm/dd/yy')
END TRY
BEGIN CATCH
END CATCH
/*apply second format you want */
BEGIN TRY
set @ConvertDateInMDYFormat = (select @dateString,convert(varchar,@dateString,101),103,'mm/dd/yy')
END TRY
BEGIN CATCH
END CATCH
.... apply all format as above which possbile to give datetime as per your requirement
return @ConvertDateInMDYFormat
END