SQL Server 2012:从时间戳列舍入到NEAREST(!)月初(以时间戳格式)

时间:2012-12-02 00:52:24

标签: tsql sql-server-2012

我需要从时间戳列中舍入到月末(以时间戳格式)。

如何实现这一目标?

示例:

TimestampColumn A:             Rounded to these values
2012-01-07 18:18:29.923        2012-01-01 00:00:00.000
2012-01-14 12:58:13.122        2012-01-01 00:00:00.000
2012-06-09 17:10:30.787        2012-06-01 00:00:00.000
2012-05-31 09:29:43.870        2012-06-01 00:00:00.000
2012-10-22 12:09:47.067        2012-11-01 00:00:00.000
2012-10-15 04:35:11.013        2012-10-01 00:00:00.000

5 个答案:

答案 0 :(得分:2)

考虑先转换为日期

DECLARE @d DATETIME
set @d = CONVERT(DATE, '2012-02-14 12:58:13.122')

SET @d =  DATEADD(DAY, 1-datepart(day, @d), @d)

SELECT @d

答案 1 :(得分:0)

这是一种方法 - 只需减去您不关心的日期的所有部分:

DECLARE @d DATETIME
set @d = '2012-02-14 12:58:13.122'

SET @d =  DATEADD(DAY, 1-datepart(day, @d), @d)
SET @d =  DATEADD(hour, -datepart(hour, @d), @d)
SET @d =  DATEADD(minute, -datepart(minute, @d), @d)
SET @d =  DATEADD(second, -datepart(second, @d), @d)
SET @d =  DATEADD(millisecond, -datepart(millisecond, @d), @d)

SELECT @d

答案 2 :(得分:0)

以秒为单位计算适用月份的长度,然后确定您是否已经过了月中。根据需要前进或后退。

declare @Foo as DateTime = '2012-10-15 12:35:11.013'

select
  DateAdd( month, DateDiff( m, 0, @Foo ), 0 ) as 'Year/Month',
  DateDiff( s, DateAdd( month, DateDiff( m, 0, @Foo ), 0), @Foo ) as 'Seconds Into Month',
  DateDiff( s, DateAdd( month, DateDiff( m, 0, @Foo ), 0 ), DateAdd( month, DateDiff( m, 0, @Foo ) + 1, 0 ) ) as 'Seconds In Month',
  DateDiff( s, DateAdd( month, DateDiff( m, 0, @Foo ), 0 ), DateAdd( month, DateDiff( m, 0, @Foo ) + 1, 0 ) ) / 2 as 'Seconds In Half Month',
  DateAdd( month, DateDiff( m, 0, @Foo ) + Round( 1.0 * DateDiff( s, DateAdd( month, DateDiff( m, 0, @Foo ), 0), @Foo ) / DateDiff( s, DateAdd( month, DateDiff( m, 0, @Foo ), 0 ), DateAdd( month, DateDiff( m, 0, @Foo ) + 1, 0 ) ), 0 ), 0 ) as 'Rounded Date'

答案 3 :(得分:0)

感谢您的贡献。但是我要去找这个;它足够好。

SELECT CASE
WHEN DATEDIFF(DAY, GETDATE(), DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) + 1, 0)) > 
ABS(DATEDIFF(DAY, GETDATE(), DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0))) 
THEN DATEADD(dd, datediff(dd, 0, DATEADD(DAY, DATEDIFF(DAY, GETDATE(), DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0)), GETDATE() ) )+0, 0)
ELSE dateadd(dd, datediff(dd, 0, DATEADD(DAY, DATEDIFF(DAY, GETDATE(), DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) + 1, 0)), GETDATE() ) )+0, 0)
END

答案 4 :(得分:0)

这是一个例子。您有5个字段:要转换的日期,所需的转换日期,月份的第一天,月份的最后一天以及下个月的第一天。 只需选择您需要的内容:

SELECT
    BED_Meeting_When,
    CASE WHEN DAY(BED_Meeting_When) < 15 THEN (DATEADD(DAY, (-DAY(BED_Meeting_When) + 1), BED_Meeting_When)) ELSE DATEADD(DAY, (-DAY(BED_Meeting_When) + 1), DATEADD(MONTH, 1, BED_Meeting_When)) END,
    DATEADD(DAY, (-DAY(BED_Meeting_When) + 1), BED_Meeting_When) AS 'Arrondi au premier du mois',
    DATEADD(DAY, -1, DATEADD(MONTH, DATEDIFF(MONTH, 0, BED_Meeting_When) + 1, 0)) AS 'Arrondi au dernier du mois',
    DATEADD(DAY, (-DAY(BED_Meeting_When) + 1), DATEADD(MONTH, 1, BED_Meeting_When)) AS 'Arrondi au premier du mois suivant',
    BEMR_Titre
FROM bpri_entretien_detail
    INNER JOIN bpri_entretien_motif ON (BED_BEMR_Idx = BEMR_Idx)