如何在MySQL中获得“星期一日期”?

时间:2017-12-12 20:55:22

标签: mysql sql datetime

我有一个Oracle SQL查询,我试图在MySQL中重写。

PS:日期在这里是任意的,在实际场景中我在Tableau中使用此自定义查询,它接受用户定义的日期。“参考开始日期”与“开始日期”进行比较。

Oracle SQL查询的一部分:

CASE WHEN psr.dt_orgn IS NULL THEN NULL 
ELSE
CASE WHEN CAST('2017-05-22' AS DATE) >= CAST('2017-06-22' AS DATE) THEN TRUNC(psr.dt_orgn,'IW')
ELSE TRUNC(psr.dt_orgn + ((CAST('2017-06-22' AS DATE)-CAST('2017-05-22' AS DATE))*(INTERVAL '1' DAY)),'IW')
END
END) week

以上使用数据库中的现有日历表将日期转换为“周开始日期”,即该周的星期一日期

MySQL版本:

 CASE WHEN psr.originated IS NULL THEN NULL 
 ELSE
   CASE WHEN CAST('2017-05-22' AS DATE) >= CAST('2017-06-22' AS DATE) THEN DATE_ADD(psr.originated, 
 INTERVAL - WEEKDAY(psr.originated) DAY)
 ELSE DATE_ADD(psr.originated + ((CAST('2017-06-22'AS DATE) - CAST('2017-05-22' AS DATE)) * (INTERVAL '1' DAY))
 END
 END) week

我使用的解决方案在MySQL中找到了“周开始日期”,如下所示:

   DATE_ADD(mydate, INTERVAL(1-DAYOFWEEK(mydate)) DAY)

我这样做时遇到错误。 我的问题是如何在MySQL查询中将“1天间隔”应用于第二个其他条件?

或者是否有一个更简单的解决方案来获取MySQL的周开始日期?

2 个答案:

答案 0 :(得分:2)

我猜你问的是如何获取任意DATE值并返回最近一个星期一的DATE值。在Oracle中,您可以使用TRUNC(datestamp, 'W')来执行此操作。

这是在MySQL中实现它的一种方法:

 FROM_DAYS(TO_DAYS(datestamp) -MOD(TO_DAYS(datestamp) -2, 7))

如果你想要星期天,你可以使用

 FROM_DAYS(TO_DAYS(datestamp) -MOD(TO_DAYS(datestamp) -1, 7))

我在这里写了。 http://www.plumislandmedia.net/mysql/sql-reporting-time-intervals/

答案 1 :(得分:1)

您可以使用名为 dayname()的MySQL函数获取日期的日期,例如dayname(" 2006-04-24")将在星期一返回。在这种情况下,您只需将包含日期的行放入函数中。之后,您可以轻松比较两个日期。