2012-01-25 30 views
0

varcharの表現にyyyymmdd形式の日を追加する必要があります。 SQL Serverでdatetimevarchar(8)値を変換するとき、私はエラーを取得していますyyyymmdd形式の文字列をdatetimeに変換する

私はなぜ手掛かりを持っていません!

ここ

がどのような作品です、これは動作しません

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

私はラズロテンキの入力に問題への解決策を見つけました。 http://msdn.microsoft.com/en-us/library/ms189491.aspx

SETのDATEFORMATから独立しているいくつかの文字列の形式があるようです: は、私は再びMicrosoftのヘルプのSETのDATEFORMAT-記事を読みました。 Microsoft-Article: 一部の文字列形式、たとえばISO 8601は、DATEFORMAT設定とは独立して解釈されます。さまざまな形式のDATEFORMATの使用方法の詳細については、「日付と時刻の使用」の「文字列の日付と時刻の書式」を参照してください。

ソリューションの答えがここで見つけることができます: http://msdn.microsoft.com/en-us/library/ms180878.aspx

私は

SET LANGUAGE 

の問題を解決できる設定言語は現在のセッションのSQL-Serverの-設定を設定します。 SQLサーバーによる文字列表現の解釈は、SET DATEFORMATおよびSET LANGUAGEに依存します。 私がISO 8601を選択したフォーマットは、 'SET DATETIME'に依存しないので、それが動作しなかったのです。 ここで情報を確認してください: http://msdn.microsoft.com/en-us/library/ms180878.aspx

ただし、多言語対応のため、ISO 8601の使用をお勧めします。それはなぜ私がLANGUAGEを全く変更する必要があるのか​​という問題を提起します。

+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関数の問題は、stringからdatetimeへの変換時に3番目のパラメータが無視されることです。これは、datetimeからstringへと動作しますが、構文エラーは発生しません。これは、Microsoftのドキュメントに記載されています。 – chris

+0

はい、私はしましたか? 「RechDatum」という名前の列が見つかりません。 – Mithrandir

+0

申し訳ありませんがMithrandir、あなたはそれ以上の関心を失うことはないと思います。私は間違ったテーブルを掲示した。 – chris

1

SQLサーバーには、コンピュータの地域設定とは独立した独自の日付書式設定メカニズムがあります。

おそらく、開発者マシンと本番サーバーでは異なると言えます。どちらのフォーマットでも日付を処理できるように見えますが、唯一の問題は変更されていることと、何を準備するかがわからないことです。

のSET DATEFORMATについては、こちらの詳細をご覧ください: http://msdn.microsoft.com/en-us/library/ms189491.aspx

+0

あなたの答えはLaszloありがとうございます。しかし、SET DATEFORMATの問題を解決できませんでした。私はSET DATEFORMAT ymdを使いました。 convert(datetime、[value]) - 関数に影響を与えません。 – chris

関連する問題