PDA

View Full Version : Import تاریخ از Access به Sql server



mahak_f
سه شنبه 17 بهمن 1385, 00:49 صبح
سلام.میخوام یه جدول از Access 97 رو به Sql Server 2000 تبدیل کنم. (با استفاده از دستور Import در Sql Server )
این جدول توی Access یه ستون از نوع datetime داره که توی تبدیل به Sql Server همین ستون مایه دردسر شده و با ایراد overflow اطلاعات از کپی اونا توی Sql Server جلوگیری میکنه!
برای حل این مشکل توی Access تمام تاریخ های مثلا 1380 رو به 1980 تبدیل کردم (اخه تمام داده ها فقط مربوط به 2 سال هست.) اینبار دیگه اجازه کپی جدول و داده هاش توی Sql Server رو داد. فقط سالها به جای --13 شده --19 .
چکار کنم که حالا توی Sql Server بتونم محتویات این فیلد مربوط به تاریخ رو عوض کنم به فرم اصلیش یعنی --13؟
این ستور رو نوشتم که خوب جواب نداد :
"
update stdnew set DATE = '1380%' where DATE LIKE '1980%';"
stdnew اسم بانکیه که فیلد DATE رو داره.
اصلا کاری که کردم درسته؟

mahak_f
سه شنبه 17 بهمن 1385, 08:42 صبح
اوه کسی نیست کمک کنه؟
import بانکی که چند تا ستون از نوع date داره و محتویاتش تاریخ های شمسی هست این همه دردسرسازه؟

Kamyar.Kimiyabeigi
سه شنبه 17 بهمن 1385, 08:54 صبح
کد زیر مثالیه برای استفاده از REPLACE


CREATE TABLE t1
(c VARCHAR(10))
GO

INSERT INTO t1 (c) VALUES('کباب')
GO

SELECT * FROM t1
GO

UPDATE t1
SET c = REPLACE(c,'ک','ج')
GO

SELECT * FROM t1
GO

حالا شما بجای ج 19 بزارین و بجای ک 13
در ضمن فیلد Datetime در SQL دارای محدودیت هست و شما نمیتونین داخلش سال ..13 قرار بدین اگر میخواین از سال شمسی استفاده کنین میتونین از varchar استفاده کنین

mahak_f
سه شنبه 17 بهمن 1385, 11:53 صبح
کد زیر مثالیه برای استفاده از REPLACE


CREATE TABLE t1
(c VARCHAR(10))
GO

INSERT INTO t1 (c) VALUES('کباب')
GO

SELECT * FROM t1
GO

UPDATE t1
SET c = REPLACE(c,'ک','ج'

SELECT * FROM t1
GO

حالا شما بجای ج 19 بزارین و بجای ک 13
در ضمن فیلد Datetime در SQL دارای محدودیت هست و شما نمیتونین داخلش سال ..13 قرار بدین اگر میخواین از سال شمسی استفاده کنین میتونین از varchar استفاده کنین


از دستور Update همون جور که نوشتم تو پست قبلی استفاده کردم. قبول نمیکنه.
حالا یه کار دیگه : قبل از import کردن همین فیلد تاریخ رو توی بانک Access به text تبدیل کردم.این بار import انجام شد و نوع فیلد هم nvarchar شده. اما من میخوام فیلدهای تاریخم توی SQL همون نوع Datetime باشه. یه تیکه برنامه با VB نوشتم که تک تک این فیلد تاریخ رو از SQL بخونه به میلادی تبدیل کنه و توی یه فیلد دیگه از نوع Datetime بریزه. اینجا هم ایراد میگیره که نمیتونم داخل این فیلد بریزمش. با اینکه متغیر واسط بین تابع تغییر تاریخ و بانکم رو هم از نوع date انتخاب کردم...
چکار کنم ؟؟؟

Kamyar.Kimiyabeigi
سه شنبه 17 بهمن 1385, 12:49 عصر
از Function زیر استفاده کن برای تبدیل تاریخهای شمسی به میلادی


CREATE FUNCTION [dbo].[ShamsiToMiladi](@DateStr varchar(10))
RETURNS DATETIME
AS
BEGIN
declare @YYear int
declare @MMonth int
declare @DDay int
declare @epbase int
declare @epyear int
declare @mdays int
declare @persian_jdn int
declare @i int
declare @j int
declare @l int
declare @n int
declare @TMPRESULT varchar(10)
declare @IsValideDate int
declare @TempStr varchar(20)
DECLARE @TmpDateStr varchar(10)

SET @i=charindex('/',@DateStr)

IF LEN(@DateStr) - CHARINDEX('/', @DateStr,CHARINDEX('/', @DateStr,1)+1) = 4
BEGIN
SET @TmpDateStr = dbo.ReversDate(@DateStr)
IF ( ISDATE(@TmpDateStr) =1 )
RETURN @TmpDateStr
ELSE
RETURN NULL
END
ELSE
SET @TmpDateStr = @DateStr

IF ((@i<>0) and
(dbo.SubStrCount('/', @TmpDateStr)=2) and
(ISNUMERIC(REPLACE(@TmpDateStr,'/',''))=1) and
(charindex('.',@TmpDateStr)=0)
)
BEGIN
SET @YYear=CAST(SUBSTRING(@TmpDateStr,1,@i-1) AS INT)
IF ( @YYear< 1300 )
SET @YYear =@YYear + 1300
IF @YYear > 9999
RETURN NULL

SET @TempStr= SUBSTRING(@TmpDateStr,@i+1,Len(@TmpDateStr))

SET @i=charindex('/',@TempStr)
SET @MMonth=CAST(SUBSTRING(@TempStr,1,@i-1) AS INT)
SET @MMonth=@MMonth-- -1

SET @TempStr= SUBSTRING(@TempStr,@i+1,Len(@TempStr))

SET @DDay=CAST(@TempStr AS INT)
SET @DDay=@DDay-- - 1

IF ( @YYear >= 0 )
SET @epbase = @YYear - 474
Else
SET @epbase = @YYear - 473
SET @epyear = 474 + (@epbase % 2820)

IF (@MMonth <= 7 )
SET @mdays = ((@MMonth) - 1) * 31
Else
SET @mdays = ((@MMonth) - 1) * 30 + 6

SET @persian_jdn =(@DDay) + @mdays + CAST((((@epyear * 682) - 110) / 2816) as int) + (@epyear - 1) * 365 + CAST((@epbase / 2820) as int ) * 1029983 + (1948321 - 1)



IF (@persian_jdn > 2299160)
BEGIN
SET @l = @persian_jdn + 68569
SET @n = CAST(((4 * @l) / 146097) as int)
SET @l = @l - CAST(((146097 * @n + 3) / 4) as int)
SET @i = CAST(((4000 * (@l + 1)) / 1461001) as int)
SET @l = @l - CAST( ((1461 * @i) / 4) as int) + 31
SET @j = CAST(((80 * @l) / 2447) as int)
SET @DDay = @l - CAST( ((2447 * @j) / 80) as int)
SET @l = CAST((@j / 11) as int)
SET @MMonth = @j + 2 - 12 * @l
SET @YYear = 100 * (@n - 49) + @i + @l
END

SET @TMPRESULT=Cast(@MMonth as varchar(2))+'/'+CAST(@DDay as Varchar(2))+'/'+CAST(@YYear as varchar(4))
RETURN Cast(@TMPRESULT as Datetime)

END
RETURN NULL

END