【问题标题】:SQL query in 2012 works, 2005 does not2012 年的 SQL 查询有效,2005 年无效
【发布时间】:2014-11-10 19:22:38
【问题描述】:

我有以下查询,我需要帮助将其转换为 MS SQL 2005 可以理解的语法,因为旧版本不支持其中的 FORMAT 等内容。

"SELECT " & _
     "TMP.*," & _
     "COUNT(*) OVER () AS rCount " & _
"FROM (" & _
     "SELECT venueID, " & _
         "venueName AS venueName, " & _
         "venueAddress + ', ' + venueCity + ', ' + venueState + ' ' + venueZip AS venueAddress, " & _
         "venueLatLong AS coordinates, " & _
         "FORMAT(venueEventDate, 'MM/dd/yyyy', 'en-US') + ' @ ' + CONVERT(VARCHAR,venueTime) AS dateAndTime, " & _
         "SUBSTRING(venueLatLong, 1, CHARINDEX(',', venueLatLong)-1) AS Lat, " & _
         "SUBSTRING(venueLatLong, CHARINDEX(',', venueLatLong) + 1, 1000) AS Lng, " & _
         "(round(" & _
             "3959 * acos " & _
               "(" & _
                   "cos(radians('" & center_lat & "')) " & _
                   "* cos(radians(SUBSTRING(venueLatLong, 1, CHARINDEX(',', venueLatLong)-1))) " & _
                   "* cos(radians(SUBSTRING(venueLatLong, CHARINDEX(',', venueLatLong) + 1, 1000)) " & _
                   "- radians('" & center_lng & "')) " & _
                   "+ sin(radians('" & center_lat & "')) " & _
                   "* sin(radians(SUBSTRING(venueLatLong, 1, CHARINDEX(',', venueLatLong)-1)))" & _
               ")" & _
        ", 1, 1)) AS distance " & _
        "FROM meetUpMarkers) " & _
     "TMP " & _
"WHERE distance < " & radius & " " & _
"ORDER BY venueName,distance DESC;"

我尝试将 FORMAT 替换为 CONVERT 但它似乎仍然不正确。

当我将 FORMAT 更改为 CONVERT 我得到错误:

类型venueEventDate 不是已定义的系统类型。

更新

Uggg...现在当我在本地运行它时,我得到了这个:

现在,即使我在本地运行它,我也会收到此错误???!??!及其 2012 年:

消息 8114,第 16 级,状态 5,第 2 行 将数据类型 varchar 转换为 float 时出错。

这是否意味着第 2 行第 5 字有错误?

不胜感激。

【问题讨论】:

  • 尝试用venueEventDate as dateAndTime 替换整行。让查询正常工作后,请考虑如何格式化日期。
  • @GordonLinoff 这样做会给我错误将数据类型 varchar 转换为浮点数时出错。
  • @StealthRT,你试过 convert(varchar(40),venueEventdate, 101)
  • @StealthRT。 . .您的查询中没有任何内容会将该值转换为浮点数,因此我不理解错误消息。
  • 我建议将整个事情转换为存储过程,而不是通过查询。这样你就可以从前端传递你的参数,让 sql 端处理剩下的部分。使调试更容易,更新超级轻松。考虑到计算的复杂性,这很可能会发生变化,并且使用 procs 还消除了重新部署前端代码来更改计算的需要。

标签: sql sql-server sql-server-2005 sql-server-2012


【解决方案1】:

FORMAT()CONVERT() 的参数顺序不同。错误消息表明您将字段名称放入数据类型参数位置。它是:

FORMAT ( value, format [, culture ] )

CONVERT ( data_type [ ( length ) ] , expression [ , style ] )

尝试用这个替换FORMAT(venueEventDate, 'MM/dd/yyyy', 'en-US')

CONVERT(VARCHAR, venueEventDate, 101)`

【讨论】:

  • 不要指定没有声明长度的字符串类型,因为有时默认值为 1。VARCHAR(30) 很好。
  • @srutzky 我从来没有经历过。也就是说,VARCHAR(10) 是所有必要的,因为样式 101 的长度总是正好 10 个字符。
  • 可能是在列和/或局部变量中使用时。有两种默认值:一种是 30,一种是 1,具体取决于使用的位置。但是,是的,10 就可以了。
  • 感谢@BaconBits 为我所需要的工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多