我试图使用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”
答案 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-2017和https://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具有CONVERT
和TRY_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而不是空格)。