【问题标题】:Explicit conversion from data type date to bigint is not allowed不允许从数据类型 date 到 bigint 的显式转换
【发布时间】:2017-05-30 20:39:07
【问题描述】:

这曾经适用于DATEIME 的列类型,但现在不适用于DATE

CONVERT(BIGINT,ev.StartDate) * -1

有没有办法从DATE 列中获取BIGINT 值?

【问题讨论】:

  • 为什么不直接使用select datediff(day,'1900/01/01',ev.StartDate) 并避免一起使用......
  • 如果您将日期转换为整数,无论​​您是否知道,您都会选择 DAY ;)
  • SELECT CAST(CAST('2017-05-30 00:00:00.000' as datetime) AS decimal(8,2)) 将返回 42883SELECT CAST(CAST('2017-05-30 12:00:00.000' AS datetime) as decimal(8,2)) 将返回 42883.50 因此每一天都表示为一个数字,从 1900 年开始。

标签: sql sql-server bigint sqldatetime sql-convert


【解决方案1】:

您可以将开始日期cast 设为datetime 进行转换。

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

【讨论】:

  • startDate的数据类型是什么?
【解决方案2】:

另一种选择。这甚至会为你翻转标志

示例

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

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

退货

-42884

【讨论】:

    【解决方案3】:

    首先,SQL Server 中的日期是从 1900 年开始按天数计算的。大 int 在大约 21 亿时开始有用。这对应于 580 万范围内的一年。你真的有这么大的约会吗?

    当然,不允许转换为int。您可以投射 datetime values 。 . .但是还有其他方法吗?

    一种简单的方法是:

    select 1 + datediff(day, 0, datecol)
    

    需要“+ 1”,以便该值与实际转换匹配。 (您可以使用“-1”代替“0”。)

    或者,也许您希望 Unix 时间以秒或毫秒为单位。为此:

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

    【讨论】:

      【解决方案4】:

      您可能需要先转换为 varchar,然后再转换为 bigint

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

      【讨论】:

        猜你喜欢
        • 2017-08-27
        • 2014-06-17
        • 2015-09-26
        • 1970-01-01
        • 2023-03-11
        • 1970-01-01
        • 2022-09-23
        • 1970-01-01
        相关资源
        最近更新 更多