这听起来很奇怪,但是我想用一些数据更新date列。请在下表中找到。而且我正在处理JSON格式的数据。
CityName | data1 | data2 | date
Mumbai | 1.234 | 2.3456| Sat Jan 20 2018 12:00:00 GMT+0000 (UTC)
Mumbai | 6.234 | 2.3456| Sat Jan 20 2018 18:00:00 GMT+0000 (UTC)
Mumbai | 1.234 | 2.3456| Sun Jan 21 2018 12:00:00 GMT+0000 (UTC)
Mumbai | 2.234 | 2.3456| Sun Jan 21 2018 18:00:00 GMT+0000 (UTC)
Mumbai | 1.234 | 2.3456| Sun Jan 21 2018 24:00:00 GMT+0000 (UTC)
Mumbai | 1.234 | 2.3456| Sun Jan 21 2018 00:00:00 GMT+0000 (UTC)
Mumbai | 8.234 | 2.3456| Fri Jan 19 2018 01:00:00 GMT+0000 (UTC)
Mumbai | 3.334 | 2.3456| Fri Jan 19 2018 12:00:00 GMT+0000 (UTC)
Mumbai | 8.214 | 2.3456| Fri Jan 19 2018 14:00:00 GMT+0000 (UTC)
Mumbai | 19.234| 2.3456| Thu Jan 18 2018 12:00:00 GMT+0000 (UTC)
Pune | 1.234 | 2.3456| Wed Jan 17 2018 12:00:00 GMT+0000 (UTC)
Pune | 1.234 | 2.3456| Wed Jan 17 2018 12:00:00 GMT+0000 (UTC)
Pune | 1.234 | 2.3456| Sat Jan 20 2018 12:00:00 GMT+0000 (UTC)
Pune | 1.234 | 2.3456| Sat Jan 20 2018 18:00:00 GMT+0000 (UTC)
Pune | 1.234 | 2.3456| Sun Jan 21 2018 12:00:00 GMT+0000 (UTC)
Pune | 1.234 | 2.3456| Sun Jan 21 2018 18:00:00 GMT+0000 (UTC)
Pune | 1.234 | 2.3456| Sun Jan 21 2018 24:00:00 GMT+0000 (UTC)
Pune | 1.234 | 2.3456| Sun Jan 21 2018 00:00:00 GMT+0000 (UTC)
Pune | 1.234 | 2.3456| Fri Jan 19 2018 01:00:00 GMT+0000 (UTC)
Pune | 1.234 | 2.3456| Fri Jan 19 2018 12:00:00 GMT+0000 (UTC)
Pune | 1.234 | 2.3456| Fri Jan 19 2018 14:00:00 GMT+0000 (UTC)
Ahmadabad| 1.234 | 2.3456| Thu Jan 18 2018 12:00:00 GMT+0000 (UTC)
Ahmadabad| 1.234 | 2.3456| Wed Jan 17 2018 12:00:00 GMT+0000 (UTC)
Ahmadabad| 1.234 | 2.3456| Wed Jan 17 2018 12:00:00 GMT+0000 (UTC)
现在,根据城市名称,我想更新所有日期,例如,今天是2018年7月23日,我选择了Mumbai
,现在我想先获取与所选城市有关的所有数据(例如“孟买”)按日期降序排列,并以昨天的日期(即,每4条记录的日期从2018年7月22日开始)以降序排列,从而开始更新记录,因此时间戳会相差6个小时。但是剩余的列数据不应更新。
然后针对孟买市,如果我按降序对数据进行排序,那么我会得到
Mumbai | 1.234 | 2.3456| Sun Jan 21 2018 12:00:00 GMT+0000 (UTC)
Mumbai | 2.234 | 2.3456| Sun Jan 21 2018 18:00:00 GMT+0000 (UTC)
Mumbai | 1.234 | 2.3456| Sun Jan 21 2018 24:00:00 GMT+0000 (UTC)
Mumbai | 1.234 | 2.3456| Sun Jan 21 2018 00:00:00 GMT+0000 (UTC)
Mumbai | 1.234 | 2.3456| Sat Jan 20 2018 12:00:00 GMT+0000 (UTC)
Mumbai | 6.234 | 2.3456| Sat Jan 20 2018 18:00:00 GMT+0000 (UTC)
Mumbai | 8.234 | 2.3456| Fri Jan 19 2018 01:00:00 GMT+0000 (UTC)
Mumbai | 3.334 | 2.3456| Fri Jan 19 2018 12:00:00 GMT+0000 (UTC)
Mumbai | 8.214 | 2.3456| Fri Jan 19 2018 14:00:00 GMT+0000 (UTC)
Mumbai | 19.234| 2.3456| Thu Jan 18 2018 12:00:00 GMT+0000 (UTC)
现在预期的o / p应该是
Mumbai | 1.234 | 2.3456| Sun Jul 22 2018 00:00:00 GMT+0000 (UTC)
Mumbai | 2.234 | 2.3456| Sun Jul 22 2018 06:00:00 GMT+0000 (UTC)
Mumbai | 1.234 | 2.3456| Sun Jul 22 2018 12:00:00 GMT+0000 (UTC)
Mumbai | 1.234 | 2.3456| Sun Jul 22 2018 18:00:00 GMT+0000 (UTC)
Mumbai | 1.234 | 2.3456| Sat Jul 21 2018 00:00:00 GMT+0000 (UTC)
Mumbai | 6.234 | 2.3456| Sat Jul 21 2018 06:00:00 GMT+0000 (UTC)
Mumbai | 8.234 | 2.3456| Sat Jul 21 2018 12:00:00 GMT+0000 (UTC)
Mumbai | 3.334 | 2.3456| Sat Jul 21 2018 18:00:00 GMT+0000 (UTC)
Mumbai | 8.214 | 2.3456| Fri Jul 20 2018 00:00:00 GMT+0000 (UTC)
Mumbai | 19.234| 2.3456| Fri Jul 20 2018 06:00:00 GMT+0000 (UTC)
我不应该更新其他列数据,而只更新我要更新的日期,方法是对同一日期但在不同时间段进行4条记录。
或者也可以接受任何中间件逻辑(最好使用javascript),它不会真正更新数据库中的数据,但可以在两者之间进行操作。
我们将不胜感激....!
答案 0 :(得分:6)
这非常简单-只需对行编号,然后根据行号(SQLfiddle)计算时间
SELECT
IF(@city = cityname, @ctr := @ctr + 1, @ctr := 0) AS rownum,
@city := cityname AS cityName,
DATE_SUB(CURRENT_DATE, INTERVAL CEIL((@ctr + 1) / 4) DAY) AS datum,
SEC_TO_TIME((@ctr % 4) * 21600) AS vreme
FROM tblCity
JOIN (SELECT @ctr := 0) AS tmp
ORDER BY cityName,date DESC
(SELECT @ctr := 0) AS tmp
初始化一个自定义会话变量,其值为0。它将用于计算每个城市的行数。
然后您将获得城市和时间戳的列表-按升序对城市进行排序,但按降序对时间戳进行排序。
IF(@city = cityname, @ctr := @ctr + 1, @ctr := 0)
确保每次您为下一个城市启动新的一组行时,将行号重置为0-我们使用会话变量@city
来捕获切换。
DATE_SUB(CURRENT_DATE, INTERVAL CEIL((@ctr + 1) / 4) DAY)
只需获取当前日期,并从中减去多少天,就如同当前城市有4行的分组一样。它将对0/1/2/3行减去1,然后对4/5/6/7行减去2,然后对8/9/10/11行减去3,依此类推。
SEC_TO_TIME((@ctr % 4) * 21600)
只需将HH:MM:SS格式的秒数转换为时间,并且每行以6小时递增。
答案 1 :(得分:1)
您可以使用窗口函数ROW_NUMBER。 并使用它计算添加到当前日期的小时或秒。
但是在不同的DBMS中,日期时间函数有所不同。
因此,很难编写适用于任何数据库的SQL。
这是在MS Sql Server上运行的示例
select CityName, data1, data2
, dateadd(hour,
(((row_number() over (partition by CityName order by "date")-1)%4)*6)
-((floor((row_number() over (partition by CityName order by "date")-1)/4)+1)*24),
cast(cast(current_timestamp as Date) as datetime)) as "date"
from grad as t
where CityName = 'Mumbai'
order by t."date";
测试here
我还没有找到类似的SAP HANA在线测试仪。
但是根据某些文档,它支持窗口功能。而且它具有ADD_SECONDS函数。
因此,此SQL也许可以在SAP HANA中使用:
select CityName, data1, data2
, ADD_SECONDS(
cast(cast(current_timestamp as Date) as datetime),
((mod((row_number() over (partition by CityName order by "date")-1),4)*6)
-((floor((row_number() over (partition by CityName order by "date")-1)/4)+1)*24))*3600
) as "date"
from grad as t
where CityName = 'Mumbai'
order by t."date"
答案 2 :(得分:1)
/* let the data is stored in the values key of json object i.e */
const jsonData = { values: [
{
"cityName": "Mumbai",
"data1": 1.234,
"data2": 2.3456,
"date": "Sat Jan 20 2018 12:00:00 GMT+0000 (UTC)"
},
{
"cityName": "Mumbai",
"data1": 6.234,
"data2": 2.3456,
"date": "Sat Jan 20 2018 18:00:00 GMT+0000 (UTC)"
},
...
]};
/* clone jsonData object into dataObj*/
const dataObj = Object.assign({}, jsonData);
/* get the array of values from the cloned object i.e. dataObj */
const values = dataObj.values;
/* get name of selected city */
const selectedCity = 'mumbai';
/* find the records of the selected city from the array (convert to lowercase for matching to abort case sensitivity) */
let selectedCityRecords = values.filter(d => d.cityName.toLowerCase() === selectedCity.toLowerCase());
/* sort the records with the descending order of date */
selectedCityRecords.sort((a, b) => {
var dateA = new Date(a.date);
var dateB = new Date(b.date)
if (dateA < dateB) {
return 1;
}
if (dateA > dateB) {
return -1;
}
return 0;
});
let i = 0;
var startDate = new Date();
/* Function to calculate the process date according to slot number */
function getdateTimeSlot(processDate, slotNumber) {
processDate.setHours(slotNumber * 6, 0, 0);
return processDate;
}
/* map the selected city data records */
selectedCityRecords.map(data => {
updatedData = data;
/* with 6 hours there are 4 slot for a day, after every slot date get decrease by one */
if (i % 4 === 0) {
startDate.setDate(startDate.getDate() - 1);
}
slotNumber = i % 4;
newDate = getdateTimeSlot(startDate, slotNumber);
updatedData.date = newDate.toString();
i += 1;
return updatedData;
});
console.log(selectedCityRecords);