将多个datetime格式转换为单个sql datetime格式时出现问题

时间:2019-05-22 14:02:23

标签: sql sql-server sql-server-2012 sql-server-2016

我试图使用SQL函数将多种日期时间格式转换为datetime,我得到了结果,但是特定格式存在问题。我已附上代码和预期结果。有什么办法可以解决此问题

我已经在SQL Server 2016中尝试过

USE [db_Temp]
GO
/****** Object:  UserDefinedFunction ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE FUNCTION [dbo].[udf_viz_IsStartDateAA]
(
           @fromdate nvarchar(30)
)
RETURNS Datetime
AS
BEGIN
       -- Declare the return variable here
       DECLARE @ClearDate Datetime

               SET @ClearDate =  
               CASE WHEN ISDATE(@fromdate) = 1 THEN @fromdate 
              ELSE NULL END          

       -- Return the result of the function
       RETURN @ClearDate

END



-- Select query

SELECT [DateFormat] AS [Date format],
          [SourceDate] AS [Source date],
          [dbo].[udf_viz_IsStartDateAA]([SourceDate]) AS [Start date]
FROM [dbo].[tbl_SourceDate]

预期结果为“ 2019-06-03 00:00:00.000” 但实际结果是“ 2019-03-06 00:00:00.000”

2 个答案:

答案 0 :(得分:0)

Sql服务器不能仅从文本值推断日期格式。仅从文本中不能分辨出“ 06032019”是6月3日还是3月6日。如果没有为convert提供显式样式,则服务器会根据会话设置应用样式,请参见https://docs.microsoft.com/en-us/sql/t-sql/statements/set-dateformat-transact-sql?view=sql-server-2017https://docs.microsoft.com/en-us/sql/t-sql/statements/set-language-transact-sql

好习惯总是处理带有显式convert和样式的表示日期的字符串。

答案 1 :(得分:-1)

假设所有的日期都为yyyy-MM-dd hh:mm:ss.sss格式,则无需用户定义函数。 SQL Server具有CONVERTTRY_CONVERT,它们接受style codes

SELECT [DateFormat] AS [Date format],
       [SourceDate] AS [Source date],
       TRY_CONVERT(datetime,STUFF([SourceDate],11,1,'T'),126) AS [Start date]
FROM [dbo].[tbl_SourceDate];

我在这里也使用STUFF来将' '更改为'T'(因为ISo格式使用T而不是空格)。