2017-05-30 2 views
1

Ceci fonctionnait avec un type de colonne de DATEIME mais maintenant il ne le sera pas avec DATE.La conversion explicite à partir du type de données date à bigint n'est pas autorisée

CONVERT(BIGINT,ev.StartDate) * -1 

Y at-il de toute façon d'obtenir une valeur BIGINT d'une colonne DATE?

+1

pourquoi ne pas simplement utiliser 'select datediff (jour, '1900/01/01', ev.StartDate)' et éviter tous ensemble .... – scsimon

+1

Si vous convertissez des dates pour des entiers, vous allez pour JOUR que vous le sachiez ou non;) –

+0

'SELECT CAST (CAST ('2017-05-30 00: 00: 00.000' comme datetime) AS decimal (8,2))' retournera '42883' et 'SELECT CAST (CAST ('2017-05-30 12: 00: 00.000' AS datetime) comme décimal (8,2))' retournera '42883.50' donc chaque jour est représenté comme un nombre unique, commençant à l'année 1900 –

Répondre

2

Encore une autre option. Cela va même retourner le signe pour vous

Exemple

Declare @YourTable table (StartDate date) 
Insert Into @YourTable values ('2017-05-30') 

Select DateDiff(DAY,StartDate,-1) 
From @YourTable 

Retours

-42884 
4

Vous pouvez cast la date de début comme datetime pour la conversion.

CONVERT(BIGINT,CAST(ev.StartDate as DATETIME)) * -1 
+0

Quel est le type de données de 'startDate'? –

0

Vous pourriez avoir besoin de se convertir à varchar puis bigint

select Convert(bigint,convert(varchar(10),ev.StartDate,112))*(-1) 
2

dates d'abord, dans SQL Server sont comptés par jours à compter de l'année 1900. Un grand int commence à être utile à environ 2,1 milliards. Cela correspond à une année de l'ordre de 5,8 millions. Avez-vous vraiment des dates aussi grandes?

Bien sûr, la diffusion vers un int n'est pas autorisée. Vous pouvez émettre des valeurs datetime. . . mais y a-t-il d'autres moyens?

Une façon simple est:

select 1 + datediff(day, 0, datecol) 

Le "+ 1" est nécessaire pour la valeur correspond à la conversion réelle. (Vous pouvez utiliser "-1" au lieu de "0" à la place.)

Ou, peut-être souhaitez-vous un temps Unix en secondes ou en millisecondes. Pour cela:

select datediff_big(ms, '1970-01-01', datecol)