Преобразование строки в дату и время в формате ггггммдд - PullRequest
1 голос
/ 25 января 2012

Мне нужно добавить дни к представлению varchar в формате yyyymmdd.

Я получаю сообщение об ошибке при преобразовании значения varchar(8) в datetime в SQL Server 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

Странно то, что конверсии работают на моем компьютере с немецко-швейцарскими настройками, а не на клиентском компьютере с французской настройкой.

Ответы [ 3 ]

4 голосов
/ 25 января 2012

Это работает:

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

тоже отлично работает. Вы уверены, что столбец таблицы имеет правильный тип / формат?

2 голосов
/ 26 января 2012

Я нашел решение проблемы с вводом Laszlo Tenki.Я снова прочитал статью SET DATEFORMAT справки Microsoft: http://msdn.microsoft.com/en-us/library/ms189491.aspx

Кажется, что существуют некоторые форматы символьных строк, которые не зависят от SET DATEFORMAT.Из статьи Microsoft: Некоторые форматы символьных строк, например ISO 8601, интерпретируются независимо от настройки DATEFORMAT.Дополнительные сведения об использовании DATEFORMAT с различными форматами см. В разделе «Строковые литеральные форматы даты и времени» в разделе «Использование данных даты и времени».

Ответ решения можно найти здесь:1010 *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

Однако: Microsoft рекомендует использовать ISO 8601, потому что он совместим с несколькими языками.Возникает вопрос, зачем мне вообще нужно было менять ЯЗЫК.

1 голос
/ 26 января 2012

SQL-сервер имеет свой собственный механизм форматирования даты, который не зависит от региональных настроек компьютера.

Я бы сказал, что он, вероятно, отличается на вашей машине разработчика и производственном сервере.Похоже, что вы можете обрабатывать даты в любом формате, ваша единственная проблема в том, что они меняются, и вы не знаете наверняка, к чему готовиться.

Для SET DATEFORMAT см. Подробности здесь: http://msdn.microsoft.com/en-us/library/ms189491.aspx

...