MYSQL查询转换为SQLSERVER

时间:2018-08-16 16:42:54

标签: mysql sql sql-server

您好,目前正在从事CODEIGNITER项目,该项目已从MYSQL迁移到SQL SERVER 2014,关于SQL SERVER 2014我只知道基础知识。

大约2个星期以来,我遇到了问题,我一直试图进行搜索以解决问题,但是现在我正花费太多时间试图找到解决方法。

我在MYSQL上有以下查询

SELECT 
  *, 
  UNIX_TIMESTAMP(date) as timestamp 
FROM (`module_items`) 
JOIN `module_items_news2` 
  ON `item_id` = `id` 
WHERE 
  `module_id` = '$module_id' 
  AND $this->site = 1 
GROUP BY 
  date_format(date, '%Y%m') 
ORDER BY 
  `date` DESC

上面的代码对于MySQL数据库工作正常。

我正在尝试将其转换为SQL SERVER,但是我在SQL SERVER上没有UNIX_TIMESTAMP函数。创建函数并尝试修改查询后

DECLARE @module_id VARCHAR(1)
SET @module_id = 3
SELECT *,dbo.UNIX_TIMESTAMP(date) as timestamp 
FROM module_items JOIN module_items_news2 ON item_id = id WHERE module_id = 
@module_id 
GROUP BY date_format(date, '%Y%m') 
ORDER BY date DESC

现在我要得到

'date_format' is not a recognized built-in function name.

我如何进行操作才能使其正常工作?

亲切的问候。

2 个答案:

答案 0 :(得分:1)

在任何一个版本中都不应该使用DATE_FORMAT()。使用

GROUP BY YEAR(date), MONTH(date)

在两个数据库中。

答案 1 :(得分:0)

我不确定您想做什么,但是我怀疑您想要这样的事情:

SELECT m.*
FROM (SELECT . . . ,  -- list the columns explicitly
             ROW_NUMBER() OVER (PARTITION BY YEAR(date), MONTH(date) ORDER BY date DESC) as seqnum
      FROM module_items mi JOIN
           module_items_news2 min2 
           ON min2.item_id = mi.id
      WHERE module_id = @module_id 
     ) m
WHERE seqnum = 1
ORDER BY date DESC;

如果您确实需要将日期转换为unix时间戳,则可以使用:

DATEDIFF(second, '1970-01-01', date) as timestamp

这在SQL Server中很少需要(历史上它在Unix系统上不运行)。