我需要以varchar
格式向yyyymmdd
表示添加天数。
在SQL Server 2005中将varchar(8)
值转换为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 :(得分: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
也很好。您确定表格列具有正确的类型/格式吗?
答案 1 :(得分:2)
我找到了Laszlo Tenki输入问题的解决方案。 我再次阅读了Microsoft帮助的SET DATEFORMAT文章: http://msdn.microsoft.com/en-us/library/ms189491.aspx
似乎有一些字符串格式,与SET DATEFORMAT无关。 来自Microsoft-Article: 某些字符串格式(例如ISO 8601)的解释与DATEFORMAT设置无关。有关如何将DATEFORMAT用于不同格式的详细信息,请参阅“使用日期和时间数据”中的“字符串文字日期和时间格式”部分。
解决方案的答案可以在这里找到: http://msdn.microsoft.com/en-us/library/ms180878.aspx
我可以用
解决问题SET LANGUAGE
设置语言设置当前会话的SQL-Server-Settings。 SQL Server的字符串表示的解释取决于SET DATEFORMAT和SET LANGUAGE。 我选择ISO 8601的格式是'SET DATETIME'独立,这就是为什么不起作用。 查看此处的信息: http://msdn.microsoft.com/en-us/library/ms180878.aspx
但是:Microsoft建议使用ISO 8601,因为它与多语言兼容。这提出了一个问题,为什么我需要更改LANGUAGE。
答案 2 :(得分:1)
SQL Server具有自己的日期格式化机制,该机制独立于计算机的区域设置。
我想说你的开发者机器和生产服务器可能有所不同。它看起来你可以用任何一种格式处理日期,你唯一的问题是它会发生变化而且你不确定要准备什么。
对于SET DATEFORMAT,请在此处查看详细信息: http://msdn.microsoft.com/en-us/library/ms189491.aspx