sql >> データベース >  >> RDS >> Sqlserver

SQL Serverで日付を切り捨てる最良の方法は何ですか?

    最も近い1日に丸める 、広く使用されている3つのアプローチがあります。最初のものはdatediffを使用します 0からの日数を検索する 日付時刻。 0 日時は1900年1月1日に対応します。開始日に日差を追加すると、1日に丸められます。

    select dateadd(d, 0, datediff(d, 0, getdate()))
    

    2番目の方法はテキストベースです。テキストの説明をvarchar(10)で切り捨てます。 、日付部分のみを残す:

    select convert(varchar(10),getdate(),111)
    

    3番目の方法では、datetime は実際には1900年以降の日数を表す浮動小数点です。したがって、たとえばfloorを使用して、整数に丸めることによって 、1日の始まりを取得します:

    select cast(floor(cast(getdate() as float)) as datetime)
    

    2番目の質問に答えるために、週の始まり トリッキーです。 1つの方法は、曜日を引くことです。

    select dateadd(dd, 1 - datepart(dw, getdate()), getdate())
    

    これも時間の部分を返すので、最初の日付に到達するには、それをタイムストリッピング方法の1つと組み合わせる必要があります。たとえば、@start_of_day 読みやすさの変数として:

    declare @start_of_day datetime
    set @start_of_day = cast(floor(cast(getdate() as float)) as datetime)
    select dateadd(dd, 1 - datepart(dw, @start_of_day), @start_of_day)
    

    年、月、時、分の始まり 引き続き「1900年以降の違い」アプローチで機能します:

    select dateadd(yy, datediff(yy, 0, getdate()), 0)
    select dateadd(m, datediff(m, 0, getdate()), 0)
    select dateadd(hh, datediff(hh, 0, getdate()), 0)
    select dateadd(mi, datediff(mi, 0, getdate()), 0)
    

    秒で四捨五入 0からの秒数のため、別のアプローチが必要です オーバーフローを与えます。その回避策の1つは、1900年ではなく、1日の始まりを基準日として使用することです。

    declare @start_of_day datetime
    set @start_of_day = cast(floor(cast(getdate() as float)) as datetime)
    select dateadd(s, datediff(s, @start_of_day, getdate()), @start_of_day)
    

    5分で丸める 、分丸め方法を調整します。たとえば、/5*5を使用して、分の差の商を取ります。 :

    select dateadd(mi, datediff(mi,0,getdate())/5*5, 0)
    

    これは、4分の1時間半でも機能します。



    1. PDOでパスワードハッシュを使用してコードをより安全にするにはどうすればよいですか?

    2. PostgreSQLで読み取り専用ユーザーを作成する方法

    3. 列の値をコンマ区切りのリストに連結する

    4. Oracleの日付の減算-数値または間隔のデータ型?