RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1597178
Accepted
fazvil
fazvil
Asked:2024-10-19 12:03:52 +0000 UTC2024-10-19 12:03:52 +0000 UTC 2024-10-19 12:03:52 +0000 UTC

将年份中的天数转换为日期

  • 772

在greenplum数据库中有一个字符串类型的字段,可以使用以下构造将其转换为时间戳类型。 to_timestamp('202409676543', 'YYYYDDDSSSSSFF6') 这里的数字是随机的,主要是它由12个字符组成。 YYYY 是可以理解的年份,DDD 据我了解是一年中的第几天,SSSSS - 从这一天开始的秒数? FF6 - 也是毫秒级的。所以任务是在ms SQL server 上做类似的转换。即使你不计算秒,那么至少如何从一年中的第几天得出一个月或一天呢?例如,MySQL 显然有一个用于此目的的 makedate 公式。

sql
  • 2 2 个回答
  • 52 Views

2 个回答

  • Voted
  1. Arkee
    2024-10-20T00:12:20Z2024-10-20T00:12:20Z

    我可以说这是一个非常具体的日期转换。基本上,它们是使用标准 ODBCyyyy-MM-dd HH:mm:ss.fff或 Unix 时间戳格式构建的。这足以在大多数程序/系统之间传输日期。

    MSSQL中有一个“FORMAT”函数。但据我记得,它只从日期转换为字符串,但不能转换回来。最有可能的是,您需要直接在仅一种特定格式的请求中编写特定的转换器。像这样的东西:

    SELECT
      DATEADD(
        [MICROSECOND],
        tt.[FF6],
        DATEADD(
          [SECOND],
          tt.[SSSSS],
          DATEADD(
            [DAY],
            tt.[DDD] - 1,
            CONVERT([datetime2], tt.[YYYY] + '-01-01', 120)
          )
        )
      )
    FROM
      (
        SELECT
          t.[FormattedDate],
          SUBSTRING(t.[FormattedDate], 1, 4) AS [YYYY],
          CONVERT([smallint], SUBSTRING(t.[FormattedDate], 5, 3)) AS [DDD],
          CONVERT([int], SUBSTRING(t.[FormattedDate], 8, 5)) AS [SSSSS],
          CONVERT([int], SUBSTRING(t.[FormattedDate], 13, 6)) AS [FF6]
        FROM
          (
            SELECT 
              '202409676543000043' AS [FormattedDate]
          ) t
      ) tt
    

    但通用解析器会对性能产生很大影响。原则上,你可以自己写这样的东西(事实上它工作正常):

    CREATE FUNCTION [dbo].[CUSTOMDATEFORMAT](
      @InputString [varchar](254),
      @FormatString [varchar](254)
    )
    RETURNS [datetime2]
    BEGIN
      IF @InputString IS NULL
      BEGIN
        RETURN NULL;
      END
      IF @FormatString IS NULL
      BEGIN
        RETURN NULL;
      END
    
      SET @InputString = LTRIM(RTRIM(@InputString));
      SET @FormatString = LTRIM(RTRIM(@FormatString));
      DECLARE @InputStringLength [tinyint] = LEN(@InputString);
      DECLARE @FormatStringLength [tinyint] = LEN(@FormatString);
      IF LEN(REPLACE(@FormatString, '\', '')) = 0
      BEGIN
        RETURN NULL;
      END
    
      -- types:
      --  0 - custom char
      --  1 - year
      --  2 - month
      --  3 - day
      --  4 - hours
      --  5 - minutes
      --  6 - seconds
      --  7 - subseconds
      --  8 - am/pm designator
      --  9 - time zone info
      DECLARE @CharPositions TABLE (
        [Type] [tinyint] NOT NULL,
        [Position] [tinyint] NOT NULL,
        [Length] [tinyint] NOT NULL
      );
    
      DECLARE @InputStringPos [tinyint] = 0;
      DECLARE @CurrentPos [tinyint] = 0;
      DECLARE @CurrentChar [char](1) = '';
      DECLARE @CurrentType [tinyint] = 0;
      DECLARE @CurrentLength [tinyint] = 0;
    
      DECLARE @PrevPos [tinyint] = 0;
      DECLARE @PrevChar [char](1) = '';
      DECLARE @PrevType [tinyint] = 0;
      DECLARE @PrevLength [tinyint] = 0;
      WHILE 1 = 1
      BEGIN
        SET @CurrentPos = @CurrentPos + 1;
        IF @CurrentPos > @FormatStringLength
        BEGIN
          INSERT INTO @CharPositions VALUES (@CurrentType, @PrevPos, @CurrentLength);
          BREAK;
        END
    
        SELECT @CurrentChar = SUBSTRING(@FormatString, @CurrentPos, 1);
        IF @CurrentChar IS NULL
        BEGIN
          CONTINUE;
        END
    
        IF @PrevChar = '\'
        BEGIN
          SET @CurrentType = 0;
        END
        ELSE
        BEGIN
          IF @CurrentChar = '' OR @CurrentChar = '\' SET @CurrentType = 0;
          -- using COLLATE to compare
          --  _CI_AS - case insensetive
          --  _CS_AS - case sensetive
          -- change Cyrillic_General if database uses another collation
          ELSE IF @CurrentChar = 'y' COLLATE Cyrillic_General_CI_AS SET @CurrentType = 1;
          ELSE IF @CurrentChar = 'M' COLLATE Cyrillic_General_CS_AS SET @CurrentType = 2;
          ELSE IF @CurrentChar = 'd' COLLATE Cyrillic_General_CI_AS SET @CurrentType = 3;
          ELSE IF @CurrentChar = 'h' COLLATE Cyrillic_General_CI_AS SET @CurrentType = 4;
          ELSE IF @CurrentChar = 'm' COLLATE Cyrillic_General_CS_AS SET @CurrentType = 5;
          ELSE IF @CurrentChar = 's' COLLATE Cyrillic_General_CI_AS SET @CurrentType = 6;
          ELSE IF @CurrentChar = 'f' COLLATE Cyrillic_General_CI_AS SET @CurrentType = 7;
          ELSE IF @CurrentChar = 't' COLLATE Cyrillic_General_CI_AS SET @CurrentType = 8;
          ELSE IF @CurrentChar = 'z' COLLATE Cyrillic_General_CI_AS SET @CurrentType = 9;
          ELSE SET @CurrentType = 0;
          SET @InputStringPos = @InputStringPos + 1;
        END
    
        IF @CurrentPos = 1
        BEGIN
          SET @PrevType = @CurrentType;
          SET @PrevPos = 1;
          SET @PrevChar = @CurrentChar;
          SET @CurrentLength = 1;
          CONTINUE;
        END 
        ELSE IF @CurrentType = @PrevType
        BEGIN
          SET @CurrentLength = @CurrentLength + 1;
        END
        ELSE
        BEGIN
          SET @PrevLength = @CurrentLength;
          SET @CurrentLength = 1;
          INSERT INTO @CharPositions VALUES (@PrevType, @PrevPos, @PrevLength);
          SET @PrevType = @CurrentType;
          SET @PrevPos = @InputStringPos;
        END
    
        SET @PrevChar = @CurrentChar;
      END
    
      IF EXISTS (
        SELECT 1
        FROM @CharPositions cp
        WHERE
          cp.[Type] > 0
        GROUP BY cp.[Type]
        HAVING COUNT(*) > 1
      )
      BEGIN
        RETURN NULL;
      END
    
      DECLARE @FictiveDate [datetime];
      DECLARE @DaysOfWeek TABLE (
        [Num] [tinyint] NOT NULL,
        [ShortName] [varchar](4) NOT NULL,
        [FullName] [varchar](32) NOT NULL
      );
      DECLARE @DayNumOfWeek [tinyint] = 0;
      WHILE @DayNumOfWeek < 7
      BEGIN
        SET @DayNumOfWeek = @DayNumOfWeek + 1;
        SET @FictiveDate = CONVERT([datetime], '1753-01-' + RIGHT(CONVERT([varchar](2), @DayNumOfWeek), 2), 120);
        INSERT INTO @DaysOfWeek
        VALUES (
          DATEPART([WEEKDAY], @FictiveDate),
          FORMAT(@FictiveDate, 'ddd'),
          FORMAT(@FictiveDate, 'dddd')
        );
      END
      DECLARE @Months TABLE (
        [Num] [tinyint] NOT NULL,
        [ShortName] [varchar](4) NOT NULL,
        [FullName] [varchar](32) NOT NULL
      );
      DECLARE @MonthNum [tinyint] = 0;
      WHILE @MonthNum < 12
      BEGIN
        SET @MonthNum = @MonthNum + 1;
        SET @FictiveDate = CONVERT([datetime], '1753-' + RIGHT('0' + CONVERT([varchar](2), @MonthNum), 2) + '-01', 120)
        INSERT INTO @Months 
        VALUES (
          @MonthNum,
          FORMAT(@FictiveDate, 'MMM'),
          FORMAT(@FictiveDate, 'MMMM')
        );
      END
    
      DECLARE @FirstMonthOrDay [tinyint];
      SELECT TOP 1
        @FirstMonthOrDay = cp.[Type]
      FROM
        @CharPositions cp
      WHERE
        cp.[Type] IN (2, 3)
      ORDER BY
        cp.[Position];
    
      DECLARE @DayFormat [varchar](254);
      DECLARE @DayPosition [tinyint];
      DECLARE @DayLength [tinyint];
      DECLARE @DaySample [smallint];
    
      IF @FirstMonthOrDay = 3
      BEGIN
        SELECT
          @DayPosition = cp.[Position],
          @DayLength = cp.[Length]
        FROM
          @CharPositions cp
        WHERE
          cp.[Type] = 3;
      
        IF @DayLength BETWEEN 1 AND 2
        BEGIN
          SET @DayFormat = SUBSTRING(@InputString, @DayPosition, @DayLength);
          SET @DaySample = TRY_CONVERT([smallint], @DayFormat);
          IF @DaySample IS NULL
          BEGIN
            RETURN NULL;
          END
        END
        ELSE IF @DayLength > 2
        BEGIN
          SET @DayFormat = SUBSTRING(@InputString, @DayPosition, @InputStringLength - @DayPosition + 1);
          IF @DayLength = 3
          BEGIN
            SELECT
              @DaySample = d.[Num],
              @DayLength = LEN(d.[ShortName])
            FROM @DaysOfWeek d
            WHERE
              @DayFormat LIKE d.[ShortName] + '%';
    
            IF @DaySample IS NULL
            BEGIN
              SET @DayFormat = SUBSTRING(@InputString, @DayPosition, @DayLength);
              SET @DaySample = TRY_CONVERT([smallint], @DayFormat);
              IF @DaySample IS NULL
              BEGIN
                RETURN NULL;
              END
            END
            ELSE
            BEGIN
              UPDATE @CharPositions
              SET
                [Position] = [Position] + (@DayLength - 3) 
              WHERE
                [Position] > @DayPosition;
            END
          END
          ELSE IF @DayLength = 4
          BEGIN
            SELECT
              @DaySample = d.[Num],
              @DayLength = LEN(d.[FullName])
            FROM @DaysOfWeek d
            WHERE
              @DayFormat LIKE d.[FullName] + '%';
    
            IF @DaySample IS NULL
            BEGIN
              SET @DayFormat = SUBSTRING(@InputString, @DayPosition, @DayLength);
              SET @DaySample = TRY_CONVERT([smallint], @DayFormat);
              IF @DaySample IS NULL
              BEGIN
                RETURN NULL;
              END
            END
            ELSE
            BEGIN
              UPDATE @CharPositions
              SET
                [Position] = [Position] + (@DayLength - 4) 
              WHERE
                [Position] > @DayPosition;
            END
          END
          ELSE
          BEGIN
            RETURN NULL;
          END
        END
      END
    
      DECLARE @MonthFormat [varchar](254);
      DECLARE @MonthPosition [tinyint];
      DECLARE @MonthLength [tinyint];
      DECLARE @Month [tinyint];
      SELECT
        @MonthPosition = cp.[Position],
        @MonthLength = cp.[Length]
      FROM
        @CharPositions cp
      WHERE
        cp.[Type] = 2;
      IF @MonthLength BETWEEN 1 AND 2
      BEGIN
        SET @MonthFormat = RIGHT(SUBSTRING(@InputString, @MonthPosition, @MonthLength), 2);
        SET @Month = TRY_CONVERT([tinyint], @MonthFormat);
        IF @Month IS NULL OR @Month NOT BETWEEN 1 AND 12
        BEGIN
          RETURN NULL;
        END
      END
      ELSE IF @MonthLength > 2
      BEGIN
        SET @MonthFormat = SUBSTRING(@InputString, @MonthPosition, @InputStringLength - @MonthPosition + 1);
        IF @MonthLength = 3
        BEGIN
          SELECT
            @Month = m.[Num],
            @MonthLength = LEN(m.[ShortName])
          FROM @Months m
          WHERE
            @MonthFormat LIKE m.[ShortName] + '%';
          UPDATE @CharPositions
          SET
            [Position] = [Position] + (@MonthLength - 3) 
          WHERE
            [Position] > @MonthPosition;
        END
        ELSE IF @MonthLength = 4
        BEGIN
          SELECT
            @Month = m.[Num],
            @MonthLength = LEN(m.[FullName])
          FROM @Months m
          WHERE
            @MonthFormat LIKE m.[FullName] + '%';
          UPDATE @CharPositions
          SET
            [Position] = [Position] + (@MonthLength - 4) 
          WHERE
            [Position] > @MonthPosition;
        END
    
        IF @Month IS NULL
        BEGIN
          RETURN NULL;
        END
      END
    
      IF @FirstMonthOrDay = 2
      BEGIN
        SELECT
          @DayPosition = cp.[Position],
          @DayLength = cp.[Length]
        FROM
          @CharPositions cp
        WHERE
          cp.[Type] = 3;
      
        IF @DayLength BETWEEN 1 AND 2
        BEGIN
          SET @DayFormat = SUBSTRING(@InputString, @DayPosition, @DayLength);
          SET @DaySample = TRY_CONVERT([smallint], @DayFormat);
          IF @DaySample IS NULL
          BEGIN
            RETURN NULL;
          END
        END
        ELSE IF @DayLength > 2
        BEGIN
          SET @DayFormat = SUBSTRING(@InputString, @DayPosition, @InputStringLength - @DayPosition + 1);
          IF @DayLength = 3
          BEGIN
            SELECT
              @DaySample = d.[Num],
              @DayLength = LEN(d.[ShortName])
            FROM @DaysOfWeek d
            WHERE
              @DayFormat LIKE d.[ShortName] + '%';
    
            IF @DaySample IS NULL
            BEGIN
              SET @DayFormat = SUBSTRING(@InputString, @DayPosition, @DayLength);
              SET @DaySample = TRY_CONVERT([smallint], @DayFormat);
              IF @DaySample IS NULL
              BEGIN
                RETURN NULL;
              END
            END
            ELSE
            BEGIN
              UPDATE @CharPositions
              SET
                [Position] = [Position] + (@DayLength - 3) 
              WHERE
                [Position] > @DayPosition;
            END
          END
          ELSE IF @DayLength = 4
          BEGIN
            SELECT
              @DaySample = d.[Num],
              @DayLength = LEN(d.[FullName])
            FROM @DaysOfWeek d
            WHERE
              @DayFormat LIKE d.[FullName] + '%';
    
            IF @DaySample IS NULL
            BEGIN
              SET @DayFormat = SUBSTRING(@InputString, @DayPosition, @DayLength);
              SET @DaySample = TRY_CONVERT([smallint], @DayFormat);
              IF @DaySample IS NULL
              BEGIN
                RETURN NULL;
              END
            END
            ELSE
            BEGIN
              UPDATE @CharPositions
              SET
                [Position] = [Position] + (@DayLength - 4) 
              WHERE
                [Position] > @DayPosition;
            END
          END
          ELSE
          BEGIN
            RETURN NULL;
          END
        END
      END
    
      DECLARE @YearString [varchar](5);
      DECLARE @YearLength [tinyint];
      DECLARE @Year [smallint];
      SELECT
        @YearString = t.[YearString],
        @YearLength = t.[Length],
        @Year = TRY_CONVERT([smallint], t.[YearString])
      FROM
        (
          SELECT
            cp.[Length],
            RIGHT(SUBSTRING(@InputString, cp.[Position], cp.[Length]), 5) AS [YearString]
          FROM
            @CharPositions cp
          WHERE
            cp.[Type] = 1
        ) t;
      IF @YearLength = 2
      BEGIN
        DECLARE @CurrentEpoch [smallint] = TRY_CONVERT([smallint], LEFT(CONVERT([varchar](4), YEAR(GETDATE())), 2));
        IF @Year >= 50 AND @CurrentEpoch > 0
        BEGIN
          SET @CurrentEpoch = @CurrentEpoch - 1;
        END
        SET @Year = TRY_CONVERT([smallint], CONVERT([varchar](2), @CurrentEpoch) + RIGHT('00' + CONVERT([varchar](2), @Year), 2));
      END
    
      DECLARE @AMPMDesignator [varchar](2);
      DECLARE @AMPMDesignatorDayNight [tinyint];
      SELECT
        @AMPMDesignatorDayNight = CASE
          WHEN t.[AMPMString] = 'AM' THEN 1
          WHEN t.[AMPMString] = 'PM' THEN 2
          ELSE 0
        END
      FROM
        (
          SELECT
            RIGHT(SUBSTRING(@InputString, cp.[Position], cp.[Length]), 2) AS [AMPMString]
          FROM
            @CharPositions cp
          WHERE
            cp.[Type] = 8
        ) t;
    
      DECLARE @HourString [varchar](4);
      DECLARE @HourLength [tinyint];
      DECLARE @Hour [smallint];
      SELECT
        @HourString = t.[HourString],
        @HourLength = t.[Length],
        @Hour = TRY_CONVERT([smallint], t.[HourString])
      FROM
        (
          SELECT
            cp.[Length],
            RIGHT(SUBSTRING(@InputString, cp.[Position], cp.[Length]), 4) AS [HourString]
          FROM
            @CharPositions cp
          WHERE
            cp.[Type] = 4
        ) t;
    
      DECLARE @MinutesString [varchar](4);
      DECLARE @MinutesLength [tinyint];
      DECLARE @Minutes [smallint];
      SELECT
        @MinutesString = t.[MinutesString],
        @MinutesLength = t.[Length],
        @Minutes = TRY_CONVERT([smallint], t.[MinutesString])
      FROM
        (
          SELECT
            cp.[Length],
            RIGHT(SUBSTRING(@InputString, cp.[Position], cp.[Length]), 4) AS [MinutesString]
          FROM
            @CharPositions cp
          WHERE
            cp.[Type] = 5
        ) t;
    
      DECLARE @SecondsString [varchar](5);
      DECLARE @SecondsLength [tinyint];
      DECLARE @Seconds [int];
      SELECT
        @SecondsString = t.[SecondsString],
        @SecondsLength = t.[Length],
        @Seconds = TRY_CONVERT([int], t.[SecondsString])
      FROM
        (
          SELECT
            cp.[Length],
            RIGHT(SUBSTRING(@InputString, cp.[Position], cp.[Length]), 5) AS [SecondsString]
          FROM
            @CharPositions cp
          WHERE
            cp.[Type] = 6
        ) t;
    
      DECLARE @SubsecondsString [varchar](7);
      DECLARE @SubsecondsLength [tinyint];
      DECLARE @Subseconds [int];
      SELECT
        @SubsecondsString = t.[SubsecondsString],
        @SubsecondsLength = t.[Length],
        @Subseconds = TRY_CONVERT([int], t.[SubsecondsString])
      FROM
        (
          SELECT
            cp.[Length],
            RIGHT(SUBSTRING(@InputString, cp.[Position], cp.[Length]), 7) AS [SubsecondsString]
          FROM
            @CharPositions cp
          WHERE
            cp.[Type] = 7
        ) t;
    
      DECLARE @TimeZoneString [varchar](6);
      DECLARE @TimeZoneSign [varchar](1);
      DECLARE @TimeZoneSeparatorIndex [tinyint];
      DECLARE @TimeZoneHoursString [varchar](2);
      DECLARE @TimeZoneHours [tinyint];
      DECLARE @TimeZoneMinutesString [varchar](2);
      DECLARE @TimeZoneMinutes [tinyint];
      SELECT
        @TimeZoneSign = SUBSTRING(@InputString, cp.[Position], 1),
        @TimeZoneString = RIGHT(SUBSTRING(@InputString, cp.[Position] + 1, 5), 5)
      FROM
        @CharPositions cp
      WHERE
        cp.[Type] = 9;
      IF @TimeZoneString IS NOT NULL AND LEN(@TimeZoneString) > 0
      BEGIN
        IF SUBSTRING(@TimeZoneString, 2, 1) = ':'
        BEGIN
          SET @TimeZoneHoursString = '0' + SUBSTRING(@TimeZoneString, 1, 1);
          SET @TimeZoneMinutesString = SUBSTRING(@TimeZoneString, 3, 2);
        END
        ELSE IF SUBSTRING(@TimeZoneString, 3, 1) = ':'
        BEGIN
          SET @TimeZoneHoursString = SUBSTRING(@TimeZoneString, 1, 2);
          SET @TimeZoneMinutesString = SUBSTRING(@TimeZoneString, 4, 2);
        END
        SET @TimeZoneSign = CASE WHEN @TimeZoneSign IN ('+', '-') THEN @TimeZoneSign ELSE NULL END;
        SET @TimeZoneHours = TRY_CONVERT([tinyint], @TimeZoneHoursString);
        SET @TimeZoneMinutes = TRY_CONVERT([tinyint], @TimeZoneMinutesString);
      END
    
      DECLARE @OutputDate [datetime2];
      IF @Year IS NULL
      BEGIN
        SET @Year = 1753;
      END
    
      SET @OutputDate = CONVERT([datetime2], CONVERT([varchar](4), @Year) + '-01-01', 120);
    
      DECLARE @HoursSet [bit] = 0;
      IF @Month IS NULL
      BEGIN
        IF @DayLength > 2 AND @DaySample BETWEEN 1 AND 366
        BEGIN
          SET @OutputDate = DATEADD([DAY], @DaySample - 1, @OutputDate);
          IF YEAR(@OutputDate) > @Year
          BEGIN
            RETURN NULL;
          END
        END
        ELSE IF @DaySample IS NULL AND @HourLength = 4 AND @Hour BETWEEN 0 AND 8783 AND ISNULL(@AMPMDesignatorDayNight, 0) = 0
        BEGIN
          SET @OutputDate = DATEADD([HOUR], @Hour, @OutputDate);
          IF YEAR(@OutputDate) > @Year
          BEGIN
            RETURN NULL;
          END
          SET @HoursSet = 1;
        END
      END
      ELSE IF @Month BETWEEN 1 AND 12
      BEGIN
        SET @OutputDate = DATEADD([MONTH], @Month - 1, @OutputDate);
        IF @DayLength BETWEEN 1 AND 2 AND @DaySample BETWEEN 1 AND 31
        BEGIN
          SET @OutputDate = DATEADD([DAY], @DaySample - 1, @OutputDate);
          IF MONTH(@OutputDate) > @Month
          BEGIN
            RETURN NULL;
          END
        END
        ELSE IF @DayLength > 2 AND @DaySample BETWEEN 1 AND 7
        BEGIN
          DECLARE @MonthStartDayWeek [smallint] = DATEPART([WEEKDAY], @OutputDate) - 1;
          DECLARE @TargetDayWeek [smallint] = @DaySample - 1;
          DECLARE @DayWeekDiff [smallint];
          IF @TargetDayWeek >= @MonthStartDayWeek
          BEGIN
            SET @DayWeekDiff = ABS(@MonthStartDayWeek - @TargetDayWeek);
          END
          ELSE
          BEGIN
            SET @DayWeekDiff = (7 - @MonthStartDayWeek) + @TargetDayWeek;
          END
          SET @OutputDate = DATEADD([DAY], @DayWeekDiff, @OutputDate);
        END
        ELSE IF @DaySample IS NULL AND @HourLength = 4 AND @Hour BETWEEN 0 AND 8783 AND ISNULL(@AMPMDesignatorDayNight, 0) = 0
        BEGIN
          SET @OutputDate = DATEADD([HOUR], @Hour, @OutputDate);
          IF YEAR(@OutputDate) > @Year
          BEGIN
            RETURN NULL;
          END
          SET @HoursSet = 1;
        END
      END
      ELSE
      BEGIN
        RETURN NULL;
      END
    
      DECLARE @SecondsSet [bit] = 0;
      IF @HoursSet = 1
      BEGIN
        IF @Minutes BETWEEN 0 AND 59
        BEGIN
          SET @OutputDate = DATEADD([MINUTE], @Minutes, @OutputDate);
          IF @Seconds BETWEEN 0 AND 59
          BEGIN
            SET @OutputDate = DATEADD([SECOND], @Seconds, @OutputDate);
            SET @SecondsSet = 1;
          END
        END
        ELSE IF @Minutes IS NULL AND @SecondsLength = 4 AND @Seconds BETWEEN 0 AND 3599
        BEGIN
          SET @OutputDate = DATEADD([SECOND], @Seconds, @OutputDate);
          SET @SecondsSet = 1;
        END
      END
      ELSE
      BEGIN
        IF @Hour BETWEEN 0 AND 23
        BEGIN
          IF @AMPMDesignatorDayNight > 0
          BEGIN
            IF @Hour BETWEEN 1 AND 12
            BEGIN
              IF @AMPMDesignatorDayNight = 1
              BEGIN
                IF @Hour = 12
                BEGIN
                  SET @Hour = 0;
                END
              END
              ELSE IF @AMPMDesignatorDayNight = 2
              BEGIN
                IF @Hour = 12
                BEGIN
                  SET @Hour = 12;
                END
                ELSE
                BEGIN
                  SET @Hour = @Hour + 12;
                END
              END
              ELSE
              BEGIN
                RETURN NULL;
              END
            END
          END
          SET @OutputDate = DATEADD([HOUR], @Hour, @OutputDate);
          IF @Minutes BETWEEN 0 AND 59
          BEGIN
            SET @OutputDate = DATEADD([MINUTE], @Minutes, @OutputDate);
            IF @Seconds BETWEEN 0 AND 59
            BEGIN
              SET @OutputDate = DATEADD([SECOND], @Seconds, @OutputDate);
              SET @SecondsSet = 1;
            END
          END
          ELSE IF @Minutes IS NULL AND @SecondsLength = 4 AND @Seconds BETWEEN 0 AND 3599
          BEGIN
            SET @OutputDate = DATEADD([SECOND], @Seconds, @OutputDate);
            SET @SecondsSet = 1;
          END
        END
        ELSE IF @Hour IS NULL AND @MinutesLength = 4 AND @Minutes BETWEEN 0 AND 1439
        BEGIN
          SET @OutputDate = DATEADD([MINUTE], @Minutes, @OutputDate);
          IF @Seconds BETWEEN 0 AND 59
          BEGIN
            SET @OutputDate = DATEADD([SECOND], @Seconds, @OutputDate);
            SET @SecondsSet = 1;
          END
        END
        ELSE IF @Hour IS NULL AND @Minutes IS NULL AND @SecondsLength = 5 AND @Seconds BETWEEN 0 AND 86399
        BEGIN
          SET @OutputDate = DATEADD([SECOND], @Seconds, @OutputDate);
          SET @SecondsSet = 1;
        END
      END
    
      IF @SecondsSet = 1
      BEGIN
        IF @SubsecondsLength = 1
        BEGIN
          SET @OutputDate = DATEADD([MILLISECOND], @Subseconds * 100, @OutputDate);
        END
        ELSE IF @SubsecondsLength = 2
        BEGIN
          SET @OutputDate = DATEADD([MILLISECOND], @Subseconds * 10, @OutputDate);
        END
        ELSE IF @SubsecondsLength = 3
        BEGIN
          SET @OutputDate = DATEADD([MILLISECOND], @Subseconds, @OutputDate);
        END
        ELSE IF @SubsecondsLength = 4
        BEGIN
          SET @OutputDate = DATEADD([MICROSECOND], @Subseconds * 100, @OutputDate);
        END
        ELSE IF @SubsecondsLength = 5
        BEGIN
          SET @OutputDate = DATEADD([MICROSECOND], @Subseconds * 10, @OutputDate);
        END
        ELSE IF @SubsecondsLength = 6
        BEGIN
          SET @OutputDate = DATEADD([MICROSECOND], @Subseconds, @OutputDate);
        END
        ELSE IF @SubsecondsLength = 7
        BEGIN
          DECLARE @FullSubSecond [int] = @Subseconds * 100;
          SET @OutputDate = DATEADD([NANOSECOND], @FullSubSecond, @OutputDate);
        END
      END
    
      IF @TimeZoneHours BETWEEN 0 AND 23
      BEGIN
        IF @TimeZoneSign = '-'
        BEGIN
          SET @OutputDate = DATEADD([HOUR], -@TimeZoneHours, @OutputDate);
          IF @TimeZoneMinutes BETWEEN 0 AND 59
          BEGIN
            SET @OutputDate = DATEADD([MINUTE], -@TimeZoneMinutes, @OutputDate);
          END
        END
        ELSE
        BEGIN
          SET @OutputDate = DATEADD([HOUR], @TimeZoneHours, @OutputDate);
          IF @TimeZoneMinutes BETWEEN 0 AND 59
          BEGIN
            SET @OutputDate = DATEADD([MINUTE], @TimeZoneMinutes, @OutputDate);
          END
        END
      END
    
      --SELECT @Year, @Month, @DayLength, @DaySample, @AMPMDesignatorDayNight, @Hour, @Minutes, @Seconds, @Subseconds, @TimeZoneSign, @TimeZoneHours, @TimeZoneMinutes
      RETURN @OutputDate;
    END
    

    您可以用手扭转它,以便它接受各种类型的格式作为输入并输出您需要的内容:

    SELECT
      [dbo].[CUSTOMDATEFORMAT]('202409676543000043', 'YYYYDDDSSSSSFFFFFF'),
      [dbo].[CUSTOMDATEFORMAT]('2024-10-19 23:42:43.466', 'yyyy-MM-dd HH:mm:ss.fff'),
      [dbo].[CUSTOMDATEFORMAT]('16:43', 'HH:mm'),
      [dbo].[CUSTOMDATEFORMAT]('2024 Oct 19', 'yyyy MMM dd'),
      [dbo].[CUSTOMDATEFORMAT]('2024 October Wednesday', 'yyyy MMMM dddd'),
      [dbo].[CUSTOMDATEFORMAT]('2024 Wednesday October 23:50+07:00', 'yyyy dddd MMMM hh:mmZ'),
      [dbo].[CUSTOMDATEFORMAT]('01/01/60 04:56 PM', 'dd/MM/yy HH:mm TT'),
      [dbo].[CUSTOMDATEFORMAT]('04.06.2000', 'dd.MM.yyyy'),
      [dbo].[CUSTOMDATEFORMAT]('19365', 'yyddd'),
      [dbo].[CUSTOMDATEFORMAT]('2024302', 'yyyyddd'),
      [dbo].[CUSTOMDATEFORMAT]('YEAR 2024 MONTH 10 DAY 15 HOUR 10 MINUTE 16 SECONDS 22', '\YEAR yyyy \MON\T\H MM \DA\Y dd \HOUR HH \MINU\TE mm \SECON\D\S ss');
      
    
    1 2 3 4 5 6 7 8 9 10 11
    2024-04-05 21:15:43.0000430 2024-10-19 23:42:43.4660000 1753-01-01 16:43:00.0000000 2024-10-19 00:00:00.0000000 2024-10-02 00:00:00.0000000 2024-10-03 06:50:00.0000000 1960-01-01 16:56:00.0000000 2000-06-04 00:00:00.0000000 2019-12-31 00:00:00.0000000 2024-10-28 00:00:00.0000000 2024-10-15 10:16:22.0000000
    • 1
  2. Best Answer
    rotabor
    2024-10-19T17:11:10Z2024-10-19T17:11:10Z

    你可以这样做:

    SELECT DATEADD(day,CAST(RIGHT('2024302',3) AS INT),
        DATEFROMPARTS(CAST(LEFT('2024302',4) AS INT)-1,12,31))
    

    2024-10-18

    • 0

相关问题

  • 通过 OUT 参数从过程结果输出

  • ON 关键字附近的语法错误 - SQL

  • 多表查询中的 Count() 聚合函数

  • 根据时间更改单元格中的日期

  • phpMyAdmin 中的错误 #1064 SQL 查询

  • Qt:包含变量的数据库查询

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5