2012-01-25 315 views
0

我需要在yyyymmdd格式中添加幾天到varchar表示形式。將字符串轉換爲yyyymmdd格式的日期時間

在SQL Server中varchar(8)值轉換爲datetime時,我得到一個錯誤2005

我沒有線索,爲什麼!

這裏是什麼在起作用:

select 
    convert (datetime, '20111019') 
from _table 

這是不行的,雖然在列中的值是20111019

select 
    convert (datetime, RechDatum) 
from _table 

我已經嘗試過:

convert (datetime, RechDatum, 112) 

SET DATEFORMAT ymd 

我能用自己的功能解決問題。但我仍然感到困惑,很高興爲您解答!

IF EXISTS (SELECT * FROM sysobjects WHERE name = 'getDateFromString' and type = 'FN') 
DROP FUNCTION getDateFromString 
GO 
CREATE FUNCTION getDateFromString (@Cyear VARCHAR(4), @Cmonth smallint, @Cday smallint, @offsetdays smallint) 
RETURNS DATETIME 
AS BEGIN 
    DECLARE @day SMALLINT 
    DECLARE @month SMALLINT 
    DECLARE @year SMALLINT 
    SET @day = CAST (@Cday AS SMALLINT) 
    SET @month = CAST (@Cmonth AS SMALLINT) 
    SET @year = CAST (@Cyear AS SMALLINT) 
    RETURN DateAdd(day, @offsetdays, 
       (SELECT 
        DateAdd (day, @day -1, 
         DateAdd (month, @month -1, 
          DateAdd (Year, @year-1900,0))) )) 
END 

GO

下面是表的定義,它是一個德國的ERP系統的一部分:

CREATE TABLE [dbo].[AuftrKopf](
    [ID] [int] IDENTITY(1,1) NOT NULL, 
    [IsSammelRechnung] [bit] NULL, 
    [AuftragsNr] [int] NULL, 
    [Kd_ID] [int] NULL, 
    [Fahrer_ID] [int] NULL, 
    [Debitor] [int] NULL, 
    [Fz_ID] [int] NULL, 
    [FHFz_ID] [int] NULL, 
    [AuftrArt_ID] [int] NULL, 
    [AuftrHerkunft_ID] [int] NULL, 
    [AuftrZustand_ID] [int] NULL, 
    [RechnungsArt_ID] [int] NULL, 
    [AuftragVom] [varchar](8) NULL, 
    [FertigAmUm] [varchar](12) NULL, 
    [BringenAmUm] [varchar](12) NULL, 
    [AbgeschlossenAmUm] [varchar](12) NULL, 
    [StempelkartenNr] [int] NULL, 
    [HuetchenNr] [int] NULL, 
    [LeistungsDatum] [varchar](8) NULL, 
[RechnDatum] [varchar](8) NULL, 
    [ValutaDatum] [varchar](8) NULL, 
    [NettoSummenspalte1] [decimal](18, 2) NULL, 
    [NettoSummenspalte2] [decimal](18, 2) NULL, 
    [NettoSummenspalte3] [decimal](18, 2) NULL, 
    [NettoSummenspalte4] [decimal](18, 2) NULL, 
    [NettoSummenspalte5] [decimal](18, 2) NULL, 
    [NettoSummenspalte6] [decimal](18, 2) NULL, 
    [NettoSummenspalte7] [decimal](18, 2) NULL, 
    [NettoSummenspalte8] [decimal](18, 2) NULL, 
    [NettoSummenspalte9] [decimal](18, 2) NULL, 
    [NettoSummenspalte10] [decimal](18, 2) NULL, 
    [NettoOhneSummenSpalte] [decimal](18, 2) NULL, 
    [MwStSummenspalte1] [decimal](18, 2) NULL, 
    [MwStSummenspalte2] [decimal](18, 2) NULL, 
    [MwStSummenspalte3] [decimal](18, 2) NULL, 
    [MwStBasisspalte1] [decimal](18, 2) NULL, 
    [MwStBasisspalte2] [decimal](18, 2) NULL, 
    [MwStBasisspalte3] [decimal](18, 2) NULL, 
    [BasisspalteOhneMwSt] [decimal](18, 2) NULL, 
[KdNr] [int] NULL, 
    [KdNachname] [nvarchar](50) NULL, 
    [KdVorname] [nvarchar](50) NULL, 
    [KdTelefon] [nvarchar](30) NULL, 
    [KdMobilTelefon] [nvarchar](30) NULL, 
    [KdEmail] [nvarchar](100) NULL, 
[Kennz] [nvarchar](20) NULL, 
    [BerKennz] [nvarchar](20) NULL, 
    [KM] [int] NULL, 
    [Laufleistung] [int] NULL, 
    [RabattStufe] [int] NULL, 
    [Adresse_ID] [int] NULL, 
    [CPrLieferschein] [int] NULL, 
    [BincMwSt] [bit] NULL, 
[LandWKuerzel] [nvarchar](4) NULL, 
    [Bemerkung] [nvarchar](50) NULL, 
[Verkaeufer_ID] [int] NULL, 
    [Sachbearbeiter_ID] [int] NULL, 
[PersIDFaktura] [int] NULL, 
    [Monteur_ID] [int] NULL, 
    [Team_ID] [int] NULL, 
    [CPrRepAngebot] [int] NULL, 
    [CPrRepAuftr] [int] NULL, 
    [CPrWerkstattkarte] [int] NULL, 
    [CPrRechnung] [int] NULL, 
    [CPrRechnungFormularName] [nvarchar](50) NULL, 
    [CPrRepRechnKopie] [int] NULL, 
    [CPrPickerzettel] [int] NULL, 
    [CPrVorabRechn] [int] NULL, 
    [CPrAuftrBestaet] [int] NULL, 
    [BOhneFzDaten] [bit] NULL, 
    [BOhneNr] [bit] NULL, 
    [PrOhneEinzelpreis] [bit] NULL, 
    [FHFzNW] [bit] NULL, 
    [FHDifferenzbesteuert] [bit] NULL, 
    [StornoZuAuftrNr] [int] NULL, 
    [Storno_Datum] [varchar](8) NULL, 
    [Buchungsdatum] [varchar](14) NULL, 
    [VakBuchungsModus] [int] NULL, 
    [DiffNettoKompZuSumme] [decimal](18, 2) NULL, 
    [Vorgangsart_ID] [int] NULL, 
    [Beschreibung] [ntext] NULL, 
    [IsErreichbarTel1perSMS] [bit] NULL, 
    [IsErreichbarTel1perTel] [bit] NULL, 
    [IsErreichbarMobilperSMS] [bit] NULL, 
    [IsErreichbarMobilperTel] [bit] NULL, 
    [IsErreichbarEmail] [bit] NULL, 
    [StundenGeschaetzt] [decimal](18, 2) NULL, 
    [WKZ_Zweitwaehrung] [nvarchar](3) NULL, 
    [Kurs_Zweitwaehrung] [decimal](18, 7) NULL, 
    [EndbetragInZweitwaehrung] [bit] NULL, 
    [Kulanzursprung] [int] NULL, 
    [IsKulanzgesplittet] [bit] NULL, 
    [SplitUrsprung] [int] NULL, 
    [IsGesplittet] [bit] NULL, 
    [FlottenReparaturkostenId] [int] NULL, 
    [NovaSatz] [decimal](18, 2) NULL, 
    [NovaGesamt] [decimal](18, 2) NULL, 
    [NovaBasis] [decimal](18, 2) NULL, 
    [NovaBonusMalus] [decimal](18, 2) NULL, 
    [FilialNr] [int] NULL, 
    [Angebotverfall] [varchar](8) NULL, 
    [IvecoSonderverkauf] [bit] NULL, 
    [LetzteAenderung] [varchar](14) NULL, 
    [IsAnzahlung] [bit] NULL, 
    [AnzahlungSumme] [decimal](18, 2) NULL, 
    [SADESperre] [int] NULL, 
    [SADEVersendet] [varchar](14) NULL, 
    [MP2Angebotsnummer] [int] NULL, 
    [SchadenNummer] [nvarchar](20) NULL, 
    [ReferenzAudaNet] [nvarchar](40) NULL, 
    [LetzterBearbeiter] [nvarchar](50) NULL, 
    [Rechnername] [nvarchar](50) NULL, 
    [ReferenzAudaNetCaseId] [nvarchar](40) NULL, 
[AuftragsanlageOrder] [bit] NULL, 
    [RabattDrucken] [bit] NULL, 
    [AuftragStatus1_ID] [int] NULL, 
    [AuftragStatus2_ID] [int] NULL, 
    [AuftragStatus3_ID] [int] NULL, 
    [AuftragStatus4_ID] [int] NULL, 
    [TeileZurueckBeiGutschrift] [bit] NULL, 
    [StornoGrund_ID] [int] NULL, 
    [Anleger_ID] [int] NULL, 
    [Betriebsstunden] [int] NULL, 
    [SperreSADE] [bit] NULL, 
    [FiOnlineContractId] [nvarchar](20) NULL, 
    [DWNichtMehrFragen] [bit] NULL, 
    [BestellZaehler] [int] NULL, 
    [NovaOhneAufschlag] [bit] NULL, 
    [DefaultLager_ID] [int] NULL, 
    [RechnungBezahltKennzeichnen] [bit] NULL, 
    [AnVWBackboneAsNewReported] [bit] NULL, 
    [VWBackboneRequestID] [nvarchar](20) NULL, 
    [VWBackboneConversationID] [nvarchar](70) NULL, 
    [VWBackboneStatusID] [int] NULL, 
    [VWBackboneSaga2ClaimNr] [nvarchar](2) NULL, 
    [VWBackboneSaga2GarantieAntragNr] [int] NULL, 
    [VWBackboneSaga2MaxClaims] [int] NULL, 
CONSTRAINT [PK_AuftrKopf] PRIMARY KEY CLUSTERED 
(
    [ID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,  ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] 
GO 

奇怪的是,該轉換我的電腦與德國和瑞士的設置上工作,但不是在法語設置的客戶端計算機上。

+0

你可以腳本表「作爲創建」,併發佈列定義爲RechDatum? – Andomar

+0

您收到的錯誤消息是什麼? –

回答

2

我找到了解決問題的Laszlo Tenki的輸入。 我讀了微軟幫助的SET DATEFORMAT-文章又說: http://msdn.microsoft.com/en-us/library/ms189491.aspx

似乎有一些字符串格式,獨立於SET DATEFORMAT的。 來自Microsoft文章: 某些字符串格式,例如ISO 8601,獨立於DATEFORMAT設置進行解釋。有關如何以不同格式使用DATEFORMAT的更多信息,請參閱使用日期和時間數據中的「字符串文字日期和時間格式」部分。

該解決方案的答案可以在這裏找到: http://msdn.microsoft.com/en-us/library/ms180878.aspx

我可以

SET LANGUAGE 

設置語言解決問題設置當前會話的SQL-Server的設置。 SQL-Server對String表示的解釋依賴於SET DATEFORMAT和SET LANGUAGE。 我選擇ISO 8601的格式是'SET DATETIME' - 獨立,這就是爲什麼不起作用。 查看此處的信息: http://msdn.microsoft.com/en-us/library/ms180878.aspx

但是:Microsoft建議使用ISO 8601,因爲它是多語言兼容的。這引發了一個問題,爲什麼我需要改變語言。

+0

說實話,我不明白爲什麼這會影響純粹由數字組成的日期字符串。但我很高興你能解決它! –

+0

有趣的是,YYYYMMDD獨立於格式設置。非常有趣的發現。 –

4

這工作:

DECLARE @datevar varchar(8) 
SET @datevar = '20111019' 

SELECT CONVERT(DATETIME,@datevar,114) AS RechDatum 

這:

SELECT '20111019' AS RechDatum INTO #tmp 
SELECT CONVERT(DATETIME,Rechdatum,114) AS RechDate from #tmp 

正常工作了。你確定你的表格列有正確的類型/格式嗎?

+0

我認爲該列是好的。 CONVERT函數的問題是,當從字符串轉換爲datetime時,第三個參數被忽略。它只是從日期時間到字符串,儘管它不會拋出語法錯誤。這是寫在微軟的文檔。 – chris

+0

是的,我沒有?找不到名爲「RechDatum」的列? – Mithrandir

+0

抱歉Mithrandir,我希望你沒有失去對此的興趣。我發佈了錯誤的表格。 – chris

1

SQL Server有自己的日期格式化機制,它獨立於計算機的區域設置。

我會說,它可能是在您的開發機器和生產服務器上不同。看起來你可以用任何一種格式來處理日期,唯一的問題是它發生了變化,你不知道要做什麼準備。

對於SET DATEFORMAT,看到這裏的細節: http://msdn.microsoft.com/en-us/library/ms189491.aspx

+0

謝謝你的回答Laszlo。但我無法用SET DATEFORMAT解決問題。我用SET DATEFORMAT ymd;對convert(datetime,[value])函數沒有影響。 – chris

相關問題