sql - sql将两个日期和时间之间的日期转换为月的第一天

  显示原文与译文双语对照的内容
82 0

我想转换一个日期,在两个日期和时间之间,到生产月的第一天。一个生产月份介于 01/07/2018 07:00:0001/08/2018 07:00:00 之间。时间很重要。

所以在这些 2 DateTimes之间的日期>= 01/07/2018 07:00:00 and <01/08/2018 07:00:00) 应转换为 01/07/2018所有其他月份都需要相同的情况。

以下是所需结果的几个示例:

Original DateTime -> Converted DateTime
15/07/2018 15:42:00 -> 01/07/2018
01/08/2018 05:42:00 -> 01/07/2018
01/07/2018 03:30:00 -> 01/06/2018
01/07/2018 07:36:00 -> 01/07/2018
03/08/2018 05:30:00 -> 01/08/2018
时间:原作者:0个回答

118 3

你可以使用如下查询

select 
 OriginalDate,
 ConvertedDate= dateadd(hh,7,dateadd(m,datediff(m,0,dateadd(hh,-7,OriginalDate)),0))
from yourTable

see工作演示

原作者:
83 0

计算月份的第一天,然后考虑到该点的秒数,如果小于 7小时,则减去 1个月。

select
 original, ca2.converted
from mytable
cross apply (
 select dateadd(day,-(datepart(day,original)-1), cast(original as date)) first_day
 ) ca1
cross apply (
 select case when datediff(second,first_day,original) <(7*60*60) then dateadd(month,-1, first_day) else first_day end converted
 ) ca2
原作者:
126 5

还有非常简单的解决方案:

select format(dateadd(day,-1,OrginalDateTime),'yyyy-MM-01') from OrginalTable;

试用演示程序

原作者:
83 3

这对你有什么用?可以移除到目前为止的强制转换以包括时间:

 CREATE TABLE dates
(
 dt DATETIME
 );
INSERT INTO dates VALUES ('2018-07-01 06:59:59.000'),
('2018-07-01 07:59:59.000'),
('2018-07-30 07:59:59.000'),
('2018-07-02 06:59:59.000');
SELECT 
IIF(
 DATEPART(DAY, dt) = 1 AND 
 CAST(dt AS TIME) <'07:00:00.000', CAST(DATEADD(MONTH, -1, dt) AS DATE),
 DATEADD(DAY, -(DATEPART(DAY, dt)) + 1,CAST(dt AS DATE))) [CalculatedDate]
FROM dates
原作者:
...