是否有可能在mysql的sql server中实现String to DateTime Conversion?

时间:2014-06-16 06:46:14

标签: mysql sql sql-server tsql datetime

我在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一样,并解释如上。

提前致谢。

4 个答案:

答案 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