Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.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
PostgreSQL';mySQL中的s date\u trunc_Mysql_Postgresql - Fatal编程技术网

PostgreSQL';mySQL中的s date\u trunc

PostgreSQL';mySQL中的s date\u trunc,mysql,postgresql,Mysql,Postgresql,最近,我已经熟悉了PostgreSQL(使用8.2),发现date_trunc函数非常有用,可以方便地匹配特定日期/月份/等之间的时间戳。 我认为,函数的真正用处在于它将输出保持为时间戳的格式 我不得不切换到mySQL(5.0),发现一些日期函数在比较中相当缺乏。extract函数似乎很有用,我发现的date函数解决了我的一些问题,但是有没有办法复制PostgreSQL的date_trunc 以下是我如何使用date_trunc将查询的时间戳仅与包括当前月份在内的最后4个月匹配的示例,但前提是该

最近,我已经熟悉了PostgreSQL(使用8.2),发现date_trunc函数非常有用,可以方便地匹配特定日期/月份/等之间的时间戳。 我认为,函数的真正用处在于它将输出保持为时间戳的格式

我不得不切换到mySQL(5.0),发现一些日期函数在比较中相当缺乏。extract函数似乎很有用,我发现的date函数解决了我的一些问题,但是有没有办法复制PostgreSQL的date_trunc

以下是我如何使用date_trunc将查询的时间戳仅与包括当前月份在内的最后4个月匹配的示例,但前提是该月已经过去一周:

WHERE date_trunc('month', QUERY_DATE) BETWEEN 
    date_trunc('month', now()) - INTERVAL '4 MONTH' AND 
    date_trunc('month', now() - INTERVAL '1 WEEK')
我不知道如何在mySQL中重新创建这样一个约定。因此,我最后的问题是,这种类型的查询是否可以通过尝试复制date_trunc(以及如何)在mySQL中实现,或者我是否需要开始以不同的方式查看这些类型的查询以使它们在mySQL中工作(以及如何实现的建议)

extract函数似乎很有用,我发现的date函数解决了我的一些问题,但是有没有办法复制PostgreSQL的date_trunc

事实上,看起来这将是最符合这个具体案例的

您在PG中的原始代码:

WHERE date_trunc('month', QUERY_DATE) BETWEEN 
    date_trunc('month', now()) - INTERVAL '4 MONTH' AND 
    date_trunc('month', now() - INTERVAL '1 WEEK')
使用
提取

WHERE EXTRACT(YEAR_MONTH FROM QUERY_DATE)
      BETWEEN
          EXTRACT(YEAR_MONTH FROM NOW() - INTERVAL 4 MONTH)
      AND
          EXTRACT(YEAR_MONTH FROM NOW() - INTERVAL 1 WEEK)
虽然在功能上应该是相同的,但这实际上是在进行比较之前将日期转换为YYYYMM字符串

另一个选项是使用重新生成日期字符串并将其强制到月初:

WHERE DATE_FORMAT(QUERY_DATE, '%Y-%m-01')
      BETWEEN
          DATE_FORMAT(NOW() - INTERVAL 4 MONTH, '%Y-%m-01')
      AND
          DATE_FORMAT(NOW() - INTERVAL 1 WEEK, '%Y-%m-01')

另外,请注意,MySQL在处理日期范围方面真的很差,即使在字段被索引时也是如此。如果你不小心的话,你很可能会进行一次完整的表格扫描。

晚会迟到了,但是

如果您知道时间间隔,有一种方法可以获取截断日期。例如,如果间隔为
,则可以使用以下命令将今天的日期(
now()
)截断为该月:

选择日期添加('1900-01-01',间隔时间差(月,'1900-01-01',现在())月);
鉴于上述情况,可以创建一个函数来处理其他时间间隔:

分隔符//
创建函数日期(vInterval varchar(7),vDate时间戳)
返回时间戳
开始
声明返回时间戳;
如果vInterval='year',则设置为Return=date_add('1900-01-01',interval TIMESTAMPDIFF(year,'1900-01-01',vDate)year);
elseif vInterval='quarter'然后设置为返回=日期添加('1900-01-01',间隔时间差(quarter,'1900-01-01',vDate)quarter);
elseif vInterval='month'然后设置为返回=日期添加('1900-01-01',间隔时间差(month,'1900-01-01',vDate)month);
elseif-vInterval='week'然后设置为返回=日期添加('1900-01-01',间隔时间差(week,'1900-01-01',vDate)week);
elseif-vInterval='day'然后设置为返回=日期添加('1900-01-01',间隔时间差(day,'1900-01-01',vDate)天);
elseif vInterval='hour'然后设置为返回=日期添加('1900-01-01',间隔时间差(hour,'1900-01-01',vDate)小时);
elseif-vInterval='minute'然后设置为返回=日期添加('1900-01-01',间隔时间差(minute,'1900-01-01',vDate)minute);
如果结束;
回归回归;
结束//
定界符;
像这样使用它:

select date_trunc('quarter', now())

这里有一个函数,它使用@Charles在上面推荐的
DATE\u格式
mysql函数模仿postgres的
DATE\u TRUNC
合同

删除功能(如果存在日期);
创建函数日期(
在粒度枚举中(“小时”、“日”、“月”、“年”),
in_datetime datetime(6)
)
返回日期时间(6)
确定性
开始
如果(单位为“小时”),则
返回日期格式(在日期时间中,%Y-%m-%d%H:00:00.0000);
如果结束;
如果(粒度为“天”),则
返回日期格式(在日期时间中,%Y-%m-%d 00:00:00.0000);
如果结束;
如果(粒度为“月”),则
返回日期格式(在日期时间,%Y-%m-01 00:00:00.0000中);
如果结束;
如果(粒度为“年”),则
返回日期格式(在日期时间中,%Y-01-01 00:00:00.0000');
如果结束;
结束;