Delen via


datum/tijd-gegevenstypeconversies van C naar SQL

van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

In dit onderwerp worden problemen beschreven waarmee u rekening moet houden wanneer u converteert van C-typen naar datum-/tijdtypen van SQL Server.

De conversies die in de volgende tabel worden beschreven, zijn van toepassing op conversies die op de client zijn uitgevoerd. In gevallen waarin de client fractionele tweede precisie opgeeft voor een parameter die verschilt van die gedefinieerd op de server, kan de clientconversie slagen, maar de server retourneert een fout wanneer SQLExecute- of SQLExecuteDirect- wordt aangeroepen. ODBC behandelt met name het afkappen van fractionele seconden als een fout, terwijl het gedrag van SQL Server moet worden afgerond; Afronding vindt bijvoorbeeld plaats wanneer u van datum/tijd2(6) naar datum/tijd2(2)gaat. Datum/tijd-kolomwaarden worden afgerond op 1/300e van een tweede en smalldatetime-kolommen hebben seconden ingesteld op nul door de server.

SQL_TYPE_DATE SQL_TYPE_TIME SQL_SS_TIME2 SQL_TYPE_TIMESTAMP SQL_SS_TIMESTAMPOFFSET SQL_CHAR SQL_WCHAR
SQL_C_DATE 1 - - 1,6 1,5,6 1,13 1,13
SQL_C_TIME - 1 1 1,7 1,5,7 1,13 1,13
SQL_C_SS_TIME2 - 1,3 1,10 1,7 1,5,7 1,13 1,13
SQL_C_BINARY(SQL_SS_TIME2_STRUCT) N.V.T N.V.T 1,10,11 N.V.T N.V.T N.V.T N.V.T
SQL_C_TYPE_TIMESTAMP 1,2 1,3,4 1,4,10 1,10 1,5,10 1,13 1,13
SQL_C_SS_TIMESTAMPOFFSET 1,2,8 1,3,4,8 1,4,8,10 1,8,10 1,10 1,13 1,13
SQL_C_BINARY(SQL_SS_TIMESTAMPOFFSET_STRUCT) N.V.T N.V.T N.V.T N.V.T 1,10,11 N.V.T N.V.T
SQL_C_CHAR/SQL_WCHAR (datum) 9 9 9 9,6 9,5,6 N.V.T N.V.T
SQL_C_CHAR/SQL_WCHAR (tijd2) 9 9,3 9,10 9,7,10 9,5,7,10 N.V.T N.V.T
SQL_C_CHAR/SQL_WCHAR (datum/tijd) 9,2 9,3,4 9,4,10 9,10 9,5,10 N.V.T N.V.T
SQL_C_CHAR/SQL_WCHAR (datetimeoffset) 9,2,8 9,3,4,8 9,4,8,10 9,8,10 9,10 N.V.T N.V.T
SQL_C_BINARY(SQL_DATE_STRUCT) 1,11 N.V.T N.V.T N.V.T N.V.T N.V.T N.V.T
SQL_C_BINARY(SQL_TIME_STRUCT) N.V.T N.V.T N.V.T N.V.T N.V.T N.V.T N.V.T
SQL_C_BINARY(SQL_TIMESTAMP_STRUCT) N.V.T N.V.T N.V.T N.V.T N.V.T N.V.T N.V.T

Sleutel tot symbolen

  • -: er wordt geen conversie ondersteund. Er wordt een diagnostische record gegenereerd met SQLSTATE 07006 en het bericht 'Schending van kenmerk beperkt gegevenstype'.

  • 1: als de opgegeven gegevens ongeldig zijn, wordt er een diagnostische record gegenereerd met SQLSTATE 22007 en het bericht 'Ongeldige datum/tijd-indeling'.

  • 2: Tijdvelden moeten nul zijn of er wordt een diagnostische record gegenereerd met SQLSTATE 22008 en het bericht 'Fractional truncation'.

  • 3: Fractionele seconden moeten nul zijn of er wordt een diagnostische record gegenereerd met SQLSTATE 22008 en het bericht 'Fractional truncation'.

  • 4: het datumonderdeel wordt genegeerd.

  • 5: de tijdzone is ingesteld op de tijdzone-instelling van de client.

  • 6: de tijd is ingesteld op nul.

  • 7: de datum is ingesteld op de huidige datum.

  • 8: de tijd wordt geconverteerd van de tijdzone van de client naar UTC. Als er een fout optreedt tijdens deze conversie, wordt er een diagnostische record gegenereerd met SQLSTATE 22008 en het bericht 'Datum/tijd veld overloop'.

  • 9: de tekenreeks wordt geparseerd en geconverteerd naar een datum,datum/tijd- of datum/tijdwaarde, afhankelijk van het eerste interpunctieteken en de aanwezigheid van de resterende onderdelen. De tekenreeks wordt vervolgens geconverteerd naar het doeltype, volgens de regels in de voorgaande tabel voor het brontype dat door dit proces is gedetecteerd. Als er een fout wordt gedetecteerd tijdens het parseren van de gegevens, wordt er een diagnostische record gegenereerd met SQLSTATE 22018 en het bericht 'Ongeldige tekenwaarde voor cast-specificatie'. Als voor parameters datum/tijd en smalldatetime het jaar buiten het bereik valt dat door deze typen wordt ondersteund, wordt er een diagnostische record gegenereerd met SQLSTATE 22007 en het bericht 'Ongeldige datum/tijd-indeling'.

    Voor datetimeoffset moet de waarde binnen het bereik liggen na conversie naar UTC, zelfs als er geen conversie naar UTC is aangevraagd. Dit komt doordat TDS en de server altijd de tijd normaliseren in datum/tijdoffset-waarden voor UTC, zodat de client moet controleren of tijdonderdelen binnen het bereik vallen dat wordt ondersteund na conversie naar UTC. Als de waarde zich niet binnen het ondersteunde UTC-bereik bevindt, wordt er een diagnostische record gegenereerd met SQLSTATE 22007 en het bericht 'Ongeldige datum/tijd-indeling'.

  • 10: als afkapping met gegevensverlies optreedt, wordt er een diagnostische record gegenereerd met SQLSTATE 22008 en het bericht 'Ongeldige tijdnotatie'. Deze fout treedt ook op als de waarde buiten het bereik valt dat kan worden vertegenwoordigd door het UTC-bereik dat door de server wordt gebruikt.

  • 11: Als de bytelengte van de gegevens niet gelijk is aan de grootte van de struct die is vereist voor het SQL-type, wordt er een diagnostische record gegenereerd met SQLSTATE 22003 en het bericht 'Numerieke waarde buiten het bereik'.

  • 12: Als de bytelengte van de gegevens 4 of 8 is, worden de gegevens verzonden naar de server in onbewerkte TDS smalldatetime- of datum/tijd-indeling. Als de bytelengte van de gegevens exact overeenkomt met de grootte van SQL_TIMESTAMP_STRUCT, worden de gegevens geconverteerd naar de TDS-indeling voor datum/tijd2.

  • 13: Als afkapping met gegevensverlies optreedt, wordt er een diagnostische record gegenereerd met SQLSTATE 22001 en het bericht 'Tekenreeksgegevens, rechts afgekapt'.

    Het aantal decimale seconden (de schaal) wordt bepaald op basis van de grootte van de doelkolom volgens de volgende tabel:

    Impliciete schaal Impliciete schaal
    type 0 1..9
    SQL_C_TYPE_TIMESTAMP 19 21..29

    Als voor SQL_C_TYPE_TIMESTAMP echter, als de fractionele seconden kunnen worden weergegeven met drie cijfers zonder gegevensverlies en de kolomgrootte 23 of groter is, worden er exact drie fractionele seconden cijfers gegenereerd. Dit gedrag zorgt voor achterwaartse compatibiliteit voor toepassingen die zijn ontwikkeld met oudere ODBC-stuurprogramma's.

    Voor kolomgrootten die groter zijn dan het bereik in de tabel, wordt een schaal van 9 geïmpliceerd. Deze conversie moet maximaal negen fractionele seconden cijfers toestaan, het maximum dat is toegestaan door ODBC.

    Een kolomgrootte van nul impliceert onbeperkte grootte voor tekentypen voor variabele lengte in ODBC (9 cijfers, tenzij de regel van 3 cijfers voor SQL_C_TYPE_TIMESTAMP van toepassing is). Het opgeven van een kolomgrootte van nul met een type vaste lengte is een fout.

  • N/B-: bestaand SQL Server 2005 (9.x) en eerder gedrag wordt gehandhaafd.

Zie ook

ODBC- (Datum- en tijdverbeteringen)