日期:2014-05-18 浏览次数:20664 次
/*
fcuandy
2011.3.23
this can be stored in file system or data table.
*/
DECLARE @x_SPEC XML
SET @x_SPEC =
'
<root>
<item>
<id>1</id>
<key>Passover</key>
<refKey></refKey>
<script>
DECLARE @y INT
,@hy INT
,@mat INT
,@leap INT
,@fday NUMERIC(10,2)
,@ffday NUMERIC(10,2)
,@dow INT
,@cent INT
,@leapExp INT
,@day INT
,@mo INT
,@PassoverDay DATETIME
SET @y=@year
SET @hy=@y + 3760
SET @mat = (12 * @hy + 17) %19
SET @leap = @hy %4
SET @fday = 32 + 4343 / 98496.0 + @mat + @mat * (272953 / 492480.0) + @leap / 4.0
SET @fday = @fday - @hy * (313 / 98496.0)
SET @ffday = @fday - CAST(@fday AS INT)
SET @dow = (3 * @hy + 5*@leap + CAST(@fday AS INT) + 5) % 7
IF @dow IN (2,4,6)
SET @fday = @fday + 1
ELSE IF @dow=1 AND @mat>6 AND @ffday>= 1367 / 2160.0
SET @fday = @fday + 2
ELSE IF @dow=0 AND @mat>11 AND @ffday>=23269 / 25920.0
SET @fday = @fday + 1
SET @cent = CAST(@y/100.0 AS INT)
SET @leapExp = CAST((3 * @cent - 5)/4.0 AS INT)
IF @y > 1582
SET @fday = @fday + @leapExp
SET @day = CAST(@fday AS INT)
SET @mo = 3
IF @day>153
BEGIN
SET @mo = 8
SET @day = @day - 153
END
ELSE IF @day>122
BEGIN
SET @mo = 7
SET @day = @day -122
END
ELSE IF @day > 92
BEGIN
SET @mo = 6
SET @day = @day - 92
END
ELSE IF @day > 61
BEGIN
SET @mo = 5
SET @day = @day - 61
END
ELSE IF @day > 31
BEGIN
SET @mo = 4
SET @day = @day - 31
END
SET @PassoverDay = RTRIM(@y) + ''-''+RTRIM(@mo) + ''-'' + RTRIM(@Day)
SET @outDay = @PassoverDay
</script>
</item>
<item>
<id>2</id>
<key>Easter</key>
<refKey></refKey>
<script>
DECLARE @y INT
,@cent INT
,@i INT
,@j INT
,@k INT
,@met INT
,@emo INT
,@eday INT
,@Easter DATETIME
SET @y=@year
SET @cent = @y /100
SET @met = @y % 19
SET @k = (@cent - 17) / 25
SET @i = (@cent - @cent / 4 - (@cent - @k)/3 + 19 * @met + 15)%30
SET @i = @i - (@i/28) * (1 - (@i/28) * (29/(@i+1)) * ((21-@met)/11))
SET @j = (@y + @y/4 + @i + 2 - @cent + @cent/4 ) % 7
SET @emo = 3 + (@i-@j + 40) / 44
SET @eday = @i - @j + 28 - 31 * (@emo / 4)
SET @Easter = RTRIM(@y) + ''-''+RTRIM(@emo) + ''-'' + RTRIM(@eday)
SET @outDay = @Easter
</script>
</item>
<item>
<id>3</id>
<key>OEaster</key>
<refKey></refKey>
<script>
DECLARE @y INT
,@i INT
,@j INT
,@met INT
,@emo INT
,@eday INT
,@leap INT
,@OEaster DATETIME
SET @y = @year
SET @leap = @y /100 - @y / 400 -2
SET @met = @y % 19
SET @i = (19 * @met + 15) % 30
SET @j = (@y + @y /4 + @i) % 7
SET @emo = 3 + (@i - @j + 40) / 44
SET @eday = @i - @j + 28 - 31 * (@emo /4)
SET @OEaster = RTRIM(@y) + ''-''+RTRIM(@emo) + ''-'' + RTRIM(