Проблема в преобразовании нескольких форматов даты и времени в один формат даты и времени SQL - PullRequest
0 голосов
/ 22 мая 2019

Я пытался преобразовать несколько форматов даты и времени в дату и время, используя функцию SQL, я получаю результат, но возникла проблема в конкретном формате.Я приложил код и ожидаемый результат.Есть ли способ решить эту проблему

Я пытался в 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 голосов
/ 22 мая 2019

Sql сервер не может вывести формат даты только из текстового значения. Он не может сказать «06032019» 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 и стилем.

0 голосов
/ 22 мая 2019

Если все даты указаны в формате yyyy-MM-dd hh:mm:ss.sss, то нет необходимости в пользовательской функции. SQL Server имеет CONVERT и TRY_CONVERT, который принимает коды стиля :

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, а не пробел).

...