以yyyymmdd格式将字符串转换为日期时间

时间:2012-01-25 15:59:02

标签: sql-server string datetime

我需要以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

奇怪的是,转换在我的计算机上使用德语 - 瑞士语设置,但不能在客户端计算机上运行,​​该计算机具有法语设置。

3 个答案:

答案 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