Har en tabell innhållande ett par tusen spelare (personer) som när systemet byggdes angavs med endast födelseår. Nu ska detta ändras så alla ska anges med åååå-mm-dd i en Datetime. Behöver då samtidigt konvertera alla redan inlagda till det nya och undrar då om man kan göra det i en enda sql-sats?
Idag är fältet av typen Varchar och innehåller årtal med både två och fyra siffor. Alla är dock födda på 1900-talet så om det är angivet med två siffror ska 19 läggas till framför.
De ska i det nya fältet få månad och dag 01 (ex. 80 -> 1980-01-01)
Nuvarande tabell
id | namn | player_year | player_born
3 Peter 78
4 Kalle 1979
6 Nisse 82
Önskat resultat:
id | namn | player_year | player_born
3 Peter 78 1978-01-01
4 Kalle 1979 1979-01-01
6 Nisse 82 1982-01-01
DECLARE @table table (id int, namn varchar(50), player_year varchar(4))
INSERT INTO @table
SELECT 3,'Peter','78'
UNION ALL
SELECT 4,'Kalle','1979'
UNION ALL
SELECT 6,'Nisse','82'
SELECT
id, namn, player_year,
(CASE WHEN LEN(player_year) = 2 THEN DATEADD(year, CAST(player_year AS INT), '1900-01-01') ELSE CAST(player_year AS SMALLDATETIME) END) AS player_birth
FROM
@table
Notera att du inte behöver ha med all kod utan det du behöver kolla på är CASE-satsen.