sql >> Database >  >> RDS >> Sqlserver

Waarom zou JAAR mislukken met een conversiefout van een datum?

Ik neem aan dat RValues is om de een of andere reden een stringkolom van een bepaald type. U moet dat oplossen en datumgegevens opslaan met een datumgegevenstype (uiteraard in een aparte kolom dan deze allegaartje).

Als je dat niet kunt oplossen, kun je voorkomen wat Damien hierboven beschreef door:

CASE WHEN ISDATE(RValues) = 1 THEN CONVERT(Date, RValues) END AS FechaFirma 

(Hierdoor wordt de "datum" NULL als SQL Server er niet achter kan komen hoe het naar een datum moet worden geconverteerd.)

Je kunt dit niet voorkomen door simpelweg een WHERE . toe te voegen clausule, omdat SQL Server vaak zal proberen de conversie te proberen in de SELECT lijst voordat u het filter uitvoert (alles hangt af van het plan). U kunt de volgorde van bewerkingen ook niet forceren door een subquery, CTE, join-orderhints, enz. te gebruiken. Er is een open Connect-item over dit probleem - ze zijn "op de hoogte" en "hopen het in een toekomstige versie aan te pakken ."

Kort van een CASE-expressie, die SQL Server dwingt om het ISDATE()-resultaat te evalueren voordat wordt geprobeerd om te converteren (zolang er geen aggregaten aanwezig zijn in een van de takken ), kunt u:

  • dump de gefilterde resultaten in een #temp-tabel en selecteer vervolgens uit die #temp-tabel, en pas dan alleen de conversie toe.
  • geef gewoon de string terug, en behandel het als een datum op de client, en trek daar JAAR/MAAND enz. delen uit
  • gebruik gewoon stringmanipulatie om YEAR =LEFT(col,4) etc. te trekken.
  • gebruik TRY_CONVERT() aangezien ik net heb gemerkt dat je SQL Server 2012 gebruikt:

    TRY_CONVERT(DATE, RValues) AS FechaFirma
    



  1. Qt:Windows 10:QMYSQL-stuurprogramma niet geladen

  2. Voer een query uit met samenvoeg- en door komma's gescheiden waarden in kolom in Laravel

  3. Waarom wordt de index op s hier niet gebruikt om te sorteren?

  4. Hoe een kolomnaam in SQL te hernoemen?