Pivot и Unpivot в SQL Server

У платформы .NET уже есть классы и методы, доступные для преобразования DateTimes между разными часовыми поясами. Посмотрите на методы ConvertTime класса TimeZoneInfo .

Редактирование: когда вы получаете время для ввода в базу данных, предполагая, что оно было создано с правильной информацией о часовом поясе, вы можете легко преобразовать в UTC:

DateTime utcTime = inputDateTime.ToUniversalTime();

Получить timeInfo, как это сделано в вопросе редактирования:

TimeZoneInfo timeInfo = TimeZoneInfo.FindSystemTimeZoneById(GetFromConfig.ManilaTimeZoneKey());

Когда вы отправляете время базы данных пользователю, преобразуйте его в правильный часовой пояс, используя timeInfo.

DateTime userTime = TimeZoneInfo.ConvertTimeFromUtc(dbDateTime, timeInfo);

Лично я бы попытался сохранить эту логику отдельно от методов get / set.

1
задан gotqn 18 January 2019 в 06:39
поделиться

1 ответ

Здесь вы можете найти статический пример и пример с использованием динамических операторов T-SQL:

--DROP TABLE IF EXISTS [dbo].[DataSource]; 

CREATE TABLE [dbo].[DataSource]
(
    [VISIT_ID] INT
   ,[Parameter1] TINYINT
   ,[Parameter2] TINYINT
   ,[Parameter3] TINYINT
);

INSERT INTO [dbo].[DataSource] ([VISIT_ID], [Parameter1], [Parameter2], [Parameter3])
VALUES (100, 1, 2, 1)
      ,(101, 4, 2, 1)
      ,(102, 2, 2, 0);

-- static

SELECT *
FROM [dbo].[DataSource]
UNPIVOT
(
    [value] FOR [column] IN ([Parameter1], [Parameter2], [Parameter3])
) UNPVT
PIVOT
(
    MAX([value]) FOR [VISIT_ID] IN ([100], [101], [102])
) PVT;

--- danymic

DECLARE @DynamicTSQLStatement NVARCHAR(MAX)
       ,@DynamicColumnsP NVARCHAR(MAX)
       ,@DynamicColumnsU NVARCHAR(MAX);

SET @DynamicColumnsP = STUFF
                        (
                            (
                                SELECT ',[' + [name] + ']'
                                FROM [sys].[columns]
                                WHERE [name] LIKE 'Parameter%'
                                    AND [object_id] = OBJECT_ID('[dbo].[DataSource]')
                                ORDER BY [name]
                                FOR XML PATH('') ,TYPE
                            ).value('.', 'NVARCHAR(MAX)')
                            ,1
                            ,1
                            ,''
                        );

SET @DynamicColumnsU = STUFF
                        (
                            (
                                SELECT ',[' + CAST([VISIT_ID] AS VARCHAR(12)) + ']'
                                FROM [dbo].[DataSource]                             
                                ORDER BY [VISIT_ID]
                                FOR XML PATH('') ,TYPE
                            ).value('.', 'NVARCHAR(MAX)')
                            ,1
                            ,1
                            ,''
                        );

SET @DynamicTSQLStatement = N'
SELECT *
FROM [dbo].[DataSource]
UNPIVOT
(
    [value] FOR [column] IN (' + @DynamicColumnsP + ')
) UNPVT
PIVOT
(
    MAX([value]) FOR [VISIT_ID] IN (' + @DynamicColumnsU + ')
) PVT;';

EXEC sp_executesql @DynamicTSQLStatement;
0
ответ дан gotqn 18 January 2019 в 06:39
поделиться