4

タイムスタンプ列から最も近い月の始まり (タイムスタンプ形式) に丸める必要があります。

どうすればこれを達成できますか?

例:

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
4

6 に答える 6

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
于 2012-12-03T19:46:01.867 に答える
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'
于 2012-12-02T03:29:44.493 に答える
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)
于 2015-02-04T09:02:27.400 に答える
0

これを行う1つの方法があります-気にしない日付のすべての部分を減算するだけです:

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
于 2012-12-02T01:35:43.840 に答える
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
于 2012-12-02T03:40:58.257 に答える