1

Axapata の TIMEZONESRULESDATA テーブルに格納されているデータを解釈しようとしています。特に、DST の開始/終了時刻がどのように格納されているかを把握したいと考えています。これまでのところ、私の推測は次のとおりです。

TZENUM: TIMEZONESLIST (タイムゾーン名と識別子) を参照する外部キー
YEAR: ルールが無期限に有効な場合、またはタイムゾーンルールが有効な年である場合は 0
BIAS: UTC 時間へのオフセット (分
単位) DBIAS: DST のオフセット (取得するために BIAS に追加されます) UTC からの合計オフセット)

今、私が理解していない部分について:

DYEAR,DMONTH,DDAYOFWEEK,DDAY,DHOUR,DMINUTE,DSSECOND
SYEAR,SMONTH,SDAYOFWEEK,SDAY,SOUR,SMINUTE,SSSECOND

日付から、D* は DST の開始日であり、S* は終了日であると推測できます。ただし、年と曜日フィールドが必要な理由がわかりません。また、*DAY は月の日を示していないようです。少なくとも、DST を切り替えるための正しい日を示していません。また、Axapta 独自の DateTimeUtil または Form 自動変換が日付を変換する日付にも対応していないようです。

この表の解釈方法を知っている人はいますか? または、どこで調べることができますか?

セーレン

4

3 に答える 3

1

DDAYSDAY は月の週を示しているように見えましたが、 DDAYSDAYの値が6、23、または 28 であることがわかりました。

私の理論は次のとおりです。DMONTH = 8 およびDDAYOFWEEK = 6 の場合、次のようになります。

  • DDAY = 4 ==> 8 月の第 4 土曜日
  • DDAY = 5 ==> 8 月の最後の土曜日
  • DDAY = n > 5 ==> 8 月の n 日 (DDAYOFWEEK と競合する可能性がありますか?)

では、5 より大きいSDAYおよびDDAYとは何でしょうか?

于 2009-08-18T11:22:14.173 に答える
0

Dynamics AX UTC の日付を TIMEZONESRULESDATA テーブルの適切なタイム ゾーンの日付/時刻に変換する 2 つの SQL 関数を作成しました。私がテストしたシナリオでは機能しているように見えますが、フィードバックをいただければ幸いです。

最初の関数は、任意の AX テーブルから UTC DateTime と TZID が供給され、夏時間調整を使用してタイム ゾーンで日付/時刻を生成します。

-- *** IMPORTANT NOTE: @@DATEFIRST must be 7 for this to work ***
CREATE FUNCTION [dbo].[ConvertUTCDateTime] (@DateTime DATETIME, @TZID INT)
RETURNS DATETIME
AS
BEGIN

DECLARE @AdjustedDateTime DATETIME
SET @AdjustedDateTime=@DateTime

-- Fields to be extracted from TIMEZONESRULESDATA record for TZID
DECLARE @Bias INT, @DBias INT
DECLARE @DMonth INT, @DDayOfWeek INT, @DDay INT, @DHour INT, @DMinute INT, @DSecond INT     -- Start of Daylight Saving
DECLARE @SMonth INT, @SDayOfWeek INT, @SDay INT, @SHour INT, @SMinute INT, @SSecond INT     -- End of Daylight Saving
-- Daylight Saving Date/Time ranges
DECLARE @DSTFromDateTime1 DATETIME, @DSTToDateTime1 DATETIME, @DSTFromDateTime2 DATETIME, @DSTToDateTime2 DATETIME

SELECT
    @Bias=tzr.BIAS,@DBias=tzr.DBIAS,
    @DMonth=tzr.DMONTH, @DDayOfWeek=tzr.DDAYOFWEEK, @DDay=tzr.DDAY, @DHour=tzr.DHOUR, @DMinute=tzr.DMINUTE, @DSecond=tzr.DSECOND,
    @SMonth=tzr.SMONTH, @SDayOfWeek=tzr.SDAYOFWEEK, @SDay=tzr.SDAY, @SHour=tzr.SHOUR, @SMinute=tzr.SMINUTE, @SSecond=tzr.SSECOND
FROM MyAXDatabase..TIMEZONESRULESDATA tzr
WHERE tzr.RULEID=@TZID

IF @Bias IS NOT NULL
    BEGIN
        SET @AdjustedDateTime=DATEADD(MINUTE, (-1)*@Bias, @DateTime )       -- Standard Time Zone Adjustment from UTC
        IF @DMonth>0    -- If there is Daylight Saving
            BEGIN
                SET @DSTFromDateTime1=dbo.GetDSTDateTime(@AdjustedDateTime, @DMonth, @DDayOfWeek, @DDay, @DHour, @DMinute, @DSecond )   -- Get DS Start date in year
                SET @DSTToDateTime2=dbo.GetDSTDateTime(@AdjustedDateTime, @SMonth, @SDayOfWeek, @SDay, @SHour, @SMinute, @SSecond ) -- Get DS End date in year
                IF @DSTFromDateTime1>@DSTToDateTime2
                    BEGIN
                        SET @DSTToDateTime1= DATEADD(SECOND, -1, CAST(DATEFROMPARTS( YEAR(@AdjustedDateTime)+1, 1, 1) as DATETIME)) -- End of Current Year
                        SET @DSTFromDateTime2= DATEFROMPARTS( YEAR(@AdjustedDateTime), 1, 1)                        -- Start of Current Year
                    END
                ELSE
                    BEGIN
                        SET @DSTToDateTime1=@DSTToDateTime2
                        SET @DSTFromDateTime2=@DSTFromDateTime1
                    END
                IF @AdjustedDateTime BETWEEN @DSTFromDateTime1 AND @DSTToDateTime1 
                    OR @AdjustedDateTime BETWEEN @DSTFromDateTime2 AND @DSTToDateTime2
                    SET @AdjustedDateTime=DATEADD(MINUTE, (-1)*@DBias, @AdjustedDateTime )  -- Make Daylight Saving adjustment if in DST date range
            END
    END

RETURN @AdjustedDateTime

END

2 番目の関数は、TIMEZONESRULESDATA フィールドから供給されるパラメーターに基づいて、夏時間の開始日または終了日を計算します。

-- *** IMPORTANT NOTE: @@DATEFIRST must be 7 for this to work ***
CREATE FUNCTION [dbo].[GetDSTDateTime](
@DateTime DATETIME,     -- Base Date
@Month INT,         -- Month for Start/End of DST
@DayOfWeek INT,         -- Day of Week  0=Sun..6=Sat (based on coding in TIMEZONESRULESDATA table)
@Day INT,           -- Week of the Month (confusing?!) 1-5 ; 5 means last week
@Hour INT, 
@Minute INT, 
@Second INT
) RETURNS DATETIME
AS
BEGIN

DECLARE @MyDateTime DATETIME

SET @MyDateTime=DATEFROMPARTS( YEAR(@DateTime), @Month, 1) -- First day of DST Start/End Month from @BaseDate year
SET @DayOfWeek=@DayOfWeek + 1   -- Adjust to tie in with SQL DoW 1-7

-- Establish first selected DayOfWeek in the month
IF @DayOfWeek >= DATEPART(WEEKDAY, @MyDateTime )
    SET @MyDateTime=DATEADD(DAY, @DayOfWeek - DATEPART(WEEKDAY, @MyDateTime), @MyDateTime)
ELSE
    SET @MyDateTime=DATEADD(DAY, 7-(DATEPART(WEEKDAY, @MyDateTime) - @DayOfWeek), @MyDateTime)

-- Add the appropriate number of weeks
SET @MyDateTime=DATEADD(DAY, 7*(@Day-1), @MyDateTime)

-- For last week of month ensure that date is in correct month
WHILE MONTH(@MyDateTime)<>@Month
    BEGIN
        SET @MyDateTime=DATEADD(DAY, -7, @MyDateTime)
    END;

-- Add on Hours, Minutes and Seconds
SET @MyDateTime=DATEADD(SECOND, @Second, DATEADD(MINUTE, @Minute, DATEADD(HOUR, @Hour, @MyDateTime)))

RETURN @MyDateTime

END
于 2016-11-24T13:15:06.453 に答える
0

DDAY月の週をSDAY表します (1-4、5 = 先週)

DDAYOFWEEKSDAYOFWEEK曜日を表します (0 = 日曜日)

この情報をどのように使用しますか?

于 2009-08-12T14:39:14.273 に答える