Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL-将时间戳标准化为工作时间_Sql_Mysql - Fatal编程技术网

SQL-将时间戳标准化为工作时间

SQL-将时间戳标准化为工作时间,sql,mysql,Sql,Mysql,我对这个问题的最初回答是编写脚本。我没有使用SQL,而是深入研究了Python并对其进行了规范化。我很好奇,是否有人能想出一个使用SQL的解决方案 如果某个日期发生在工作时间之外,我希望将该日期正常化为下一个工作日。我会保持这一点非常简单,并说营业时间是周一至周五上午9点至下午6点。在这些时间之外的任何事情都是在营业时间之外的 应该改变日期,使星期六下午2点变成星期一上午9点(商业周的第一个合法时间)。周三晚上7点变成周四上午9点。等等等等,让我们忽略假期吧 样本数据: mysql> se

我对这个问题的最初回答是编写脚本。我没有使用SQL,而是深入研究了Python并对其进行了规范化。我很好奇,是否有人能想出一个使用SQL的解决方案

如果某个日期发生在工作时间之外,我希望将该日期正常化为下一个工作日。我会保持这一点非常简单,并说营业时间是周一至周五上午9点至下午6点。在这些时间之外的任何事情都是在营业时间之外的

应该改变日期,使星期六下午2点变成星期一上午9点(商业周的第一个合法时间)。周三晚上7点变成周四上午9点。等等等等,让我们忽略假期吧

样本数据:

mysql> select mydate from mytable ORDER by mydate;
+---------------------+
| mydate              |
+---------------------+
| 2009-09-13 17:03:09 | 
| 2009-09-14 09:45:49 | 
| 2009-09-15 09:57:28 | 
| 2009-09-16 21:55:01 | 
+---------------------+
4 rows in set (0.00 sec)
第一个日期是星期天,所以应该正常化为2009-09-14 09:00:00

第二天可以,是星期一上午9点

第三次约会可以,是星期二上午9点


第四个日期是周三晚上9点(我们的工作时间从上午9点到下午6点除外),应该转换为周四上午9点。

不确定为什么要这样做,但如果数据库中的所有数据都需要始终为真,则需要一个触发器。我将设置一个表,从中提取指定的营业时间,您可以使用该表确定下一个有效的营业时间日期和时间。(我甚至可以考虑制定一张表格,告诉你下一个工作日和每一个小时是什么样的,这不是改变很多,如果你改变了下一年的假期,或者如果你改变了整个营业时间,就可能每年更新一次。通过预处理,你可以节省时间来处理这个问题。)我还想继续使用您的脚本,因为最好在输入数据之前修复数据,但您需要触发器来确保来自任何源的数据(以及迟早会有来自应用程序以外的源的更改)符合数据完整性规则。

不确定为什么要这样做,但是,如果数据库中的所有数据都需要始终为真,则需要一个触发器。我将设置一个表,从中提取指定的营业时间,您可以使用该表确定下一个有效的营业时间日期和时间。(我甚至可以考虑制定一张表格,告诉你下一个工作日和每一个小时是什么样的,这不是改变很多,如果你改变了下一年的假期,或者如果你改变了整个营业时间,就可能每年更新一次。通过预处理,你可以节省时间来处理这个问题。)我还想继续使用您的脚本,因为最好在输入数据之前修复数据,但您需要触发器来确保来自任何源的数据(以及迟早会有来自应用程序以外的源的更改)符合数据完整性规则。

我认为您不能在一个查询中完成此操作,但您可以尝试以下方法:

-- Mon-Thu, after 17:00
-- Set date = next day, 9:00
UPDATE 
    myTable 
SET  
    mydate = DATE_ADD(DATE_ADD(DATE(date), INTERVAL 1 DAY), INTERVAL 9 HOUR) 
WHERE 
    TIME(mydate) >= 17 
    AND DAYOFWEEK(mydate) IN (1,2,3,4)

-- Mon-Fri, before 9:00
-- Set date = the same day, 9:00
UPDATE 
    myTable 
SET 
    mydate = DATE_ADD(DATE(date), INTERVAL 9 HOUR) 
WHERE 
    TIME(mydate) < 9 
    AND DAYOFWEEK(mydate) IN (1,2,3,4,5)

-- Fri, after 17:00, Sat, Sun
-- Set date = monday, 9.00
UPDATE 
    myTable 
SET 
    mydate = DATE_ADD(DATE_ADD(DATE(date), INTERVAL 3 DAY), INTERVAL 9 HOUR) 
WHERE 
    (TIME(mydate) >= 17 
    AND DAYOFWEEK(mydate) = 5) 
    OR DAYOFWEEK(mydate) IN (6,7)
——周一到周四,17:00之后
--设置日期=第二天9:00
更新
我的桌子
设置
mydate=日期添加(日期添加(日期),间隔1天,间隔9小时)
哪里
时间(mydate)>=17
(1,2,3,4)中的星期日(mydate)
--周一至周五,9:00之前
--设置日期=当天9:00
更新
我的桌子
设置
mydate=日期(日期,间隔9小时)
哪里
时间(mydate)<9
(1,2,3,4,5)中的星期日(mydate)
--星期五,17:00后,星期六,星期日
--设定日期=星期一,9.00
更新
我的桌子
设置
mydate=日期添加(日期添加(日期),间隔3天,间隔9小时)
哪里
(时间(mydate)>=17
和星期日(mydate)=5)
或(6,7)中的星期日(mydate)

我不认为您可以在一个查询中完成,但您可以尝试以下方法:

-- Mon-Thu, after 17:00
-- Set date = next day, 9:00
UPDATE 
    myTable 
SET  
    mydate = DATE_ADD(DATE_ADD(DATE(date), INTERVAL 1 DAY), INTERVAL 9 HOUR) 
WHERE 
    TIME(mydate) >= 17 
    AND DAYOFWEEK(mydate) IN (1,2,3,4)

-- Mon-Fri, before 9:00
-- Set date = the same day, 9:00
UPDATE 
    myTable 
SET 
    mydate = DATE_ADD(DATE(date), INTERVAL 9 HOUR) 
WHERE 
    TIME(mydate) < 9 
    AND DAYOFWEEK(mydate) IN (1,2,3,4,5)

-- Fri, after 17:00, Sat, Sun
-- Set date = monday, 9.00
UPDATE 
    myTable 
SET 
    mydate = DATE_ADD(DATE_ADD(DATE(date), INTERVAL 3 DAY), INTERVAL 9 HOUR) 
WHERE 
    (TIME(mydate) >= 17 
    AND DAYOFWEEK(mydate) = 5) 
    OR DAYOFWEEK(mydate) IN (6,7)
——周一到周四,17:00之后
--设置日期=第二天9:00
更新
我的桌子
设置
mydate=日期添加(日期添加(日期),间隔1天,间隔9小时)
哪里
时间(mydate)>=17
(1,2,3,4)中的星期日(mydate)
--周一至周五,9:00之前
--设置日期=当天9:00
更新
我的桌子
设置
mydate=日期(日期,间隔9小时)
哪里
时间(mydate)<9
(1,2,3,4,5)中的星期日(mydate)
--星期五,17:00后,星期六,星期日
--设定日期=星期一,9.00
更新
我的桌子
设置
mydate=日期添加(日期添加(日期),间隔3天,间隔9小时)
哪里
(时间(mydate)>=17
和星期日(mydate)=5)
或(6,7)中的星期日(mydate)

我认为您最好使用Python解决方案。。。但我喜欢挑战:)

选择mydate
,个案日调整
--臭虫
--当0时,则为mydate
--臭虫
当为0时,则为case
当小时(mydate)=更多天,然后是添加天
莫雷迪
以调整日期结束
从(
选择mydate
,工作日(mydate)为w
,小时(mydate)为小时
,案件工作日(mydate)
6时1分
5时2分
那是什么时候
案例
当小时数(mydate)>=18时,则为3
其他0
结束
其他0
以addday结束
,当小时(mydate)>=18时,则1或0结束为moreday
从mytable
按mydate订购
)别名1
)别名2
在MySQL上测试

$ mysql tmp < phil.sql
mydate  mynewdate
2009-09-12 17:03:09     2009-09-14 09:00:00
2009-09-12 21:03:09     2009-09-14 09:00:00
2009-09-13 17:03:09     2009-09-14 09:00:00
2009-09-14 09:45:49     2009-09-14 09:45:49
2009-09-15 09:57:28     2009-09-15 09:57:28
2009-09-16 21:55:01     2009-09-17 09:00:00
2009-09-17 11:03:09     2009-09-17 11:03:09
2009-09-17 22:03:09     2009-09-18 09:00:00
2009-09-18 12:03:09     2009-09-18 12:03:09
2009-09-18 19:03:09     2009-09-21 09:00:00
2009-09-19 06:03:09     2009-09-21 09:00:00
2009-09-19 16:03:09     2009-09-21 09:00:00
2009-09-19 19:03:09     2009-09-21 09:00:00
$mysql tmp