我想从表中获取记录的重复月份 我在start_date列内有叶子表,有很多记录我的数据库 https://imgur.com/a/jdyxTo1 示例我在表中有3条重复记录 返回重复记录#08.01.2019,31.01.2019,25.01.2019 该怎么做?
class LeaveController < ApplicationController
def new
#your code here
end
end
答案 0 :(得分:0)
当您尝试在单个数组中查找所有月份时,无法按月份查找重复的日期 下面可以为您提供一系列对象,其中您的月份号和该月份号的重复日期将在那里
class LeaveController < ApplicationController
def new
@result = []
12.times do |i|
month_data = {
month_number: i,
duplicate_dates: Leave.where("extract(month from start_date) = ?", i).pluck(:start_date)
}
@result.push month_data
end
#Print and see the result
p @result
end
end
由于您使用的是sqlite,并且不支持上述语法,因此可以使用以下方法:
# In your model you can write a class method so you don't have to write all that
# logic in your controller and make it reusable
class Leave < ActiveRecord::Base
def self.duplicate_dates(current_month)
query = "SELECT * FROM leaves WHERE strftime('%m', start_date) = #{current_month}"
self.find_by_sql query
end
end
class LeaveController < ApplicationController
def new
@result = []
('01'..'12').to_a.each do |i|
# Get all the records with duplicate month
duplicate_data = Leave.duplicate_dates(i)
# The above will return a regular array and not an activerecord association,
# so pluck can't be used on it
# To get only the dates you can use map
duplicate_dates = duplicate_data.map {|i| i.start_date}
month_data = {
month_number: i,
duplicate_dates: duplicate_dates
}
@result.push month_data
end
#Print and see the result
p @result
end
end
答案 1 :(得分:0)
在SQLite上,您不能这样做。支持的SQL功能实际上是最少的,您最好有一个本地的postgres / mysql服务器-您将在生产中使用的服务器和版本。
在真实的SQL数据库上,您具有EXTRACT(YEAR_MONTH from date)
函数,并且可以将其与GROUP BY
一起使用。
这可能是正确的SQL,您可以将其与普通Leave.connection.execute(...)
一起使用:
SELECT
GROUP_CONCAT(`leaves`.`id` SEPARATOR ',') AS ids,
GROUP_CONCAT(`leaves`.`start_date` SEPARATOR ',') AS start_dates
FROM `leaves`
GROUP BY EXTRACT(YEAR_MONTH from `leaves`.`start_date`)
HAVING COUNT(`leaves`.`id`) > 1
使用图像中的数据,您将得到以下结果:
ids | start_dates
------------------+---------------------------------
5,6,8 | 2019-01-08,2019-01-31,2019-01-25
1,2,3,4 | ...
没有与他人共享月份的叶子将没有条目。