2012-01-25 269 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

相关问题