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

生年月日とgetDate()に基づいて年齢(年)を計算する方法

    うるう年/日および次の方法に問題があります。以下の更新を参照してください。

    これを試してください:

    DECLARE @dob  datetime
    SET @dob='1992-01-09 00:00:00'
    
    SELECT DATEDIFF(hour,@dob,GETDATE())/8766.0 AS AgeYearsDecimal
        ,CONVERT(int,ROUND(DATEDIFF(hour,@dob,GETDATE())/8766.0,0)) AS AgeYearsIntRound
        ,DATEDIFF(hour,@dob,GETDATE())/8766 AS AgeYearsIntTrunc
    

    出力:

    AgeYearsDecimal                         AgeYearsIntRound AgeYearsIntTrunc
    --------------------------------------- ---------------- ----------------
    17.767054                               18               17
    
    (1 row(s) affected)
    

    更新 より正確な方法は次のとおりです。

    INTでの年間の最良の方法

    DECLARE @Now  datetime, @Dob datetime
    SELECT   @Now='1990-05-05', @Dob='1980-05-05'  --results in 10
    --SELECT @Now='1990-05-04', @Dob='1980-05-05'  --results in  9
    --SELECT @Now='1989-05-06', @Dob='1980-05-05'  --results in  9
    --SELECT @Now='1990-05-06', @Dob='1980-05-05'  --results in 10
    --SELECT @Now='1990-12-06', @Dob='1980-05-05'  --results in 10
    --SELECT @Now='1991-05-04', @Dob='1980-05-05'  --results in 10
    
    SELECT
        (CONVERT(int,CONVERT(char(8),@Now,112))-CONVERT(char(8),@Dob,112))/10000 AS AgeIntYears
    

    上記の10000を変更できます 10000.0へ 小数を取得しますが、以下の方法ほど正確ではありません。

    10進数での年間の最良の方法

    DECLARE @Now  datetime, @Dob datetime
    SELECT   @Now='1990-05-05', @Dob='1980-05-05' --results in 10.000000000000
    --SELECT @Now='1990-05-04', @Dob='1980-05-05' --results in  9.997260273973
    --SELECT @Now='1989-05-06', @Dob='1980-05-05' --results in  9.002739726027
    --SELECT @Now='1990-05-06', @Dob='1980-05-05' --results in 10.002739726027
    --SELECT @Now='1990-12-06', @Dob='1980-05-05' --results in 10.589041095890
    --SELECT @Now='1991-05-04', @Dob='1980-05-05' --results in 10.997260273973
    
    SELECT 1.0* DateDiff(yy,@Dob,@Now) 
        +CASE 
             WHEN @Now >= DATEFROMPARTS(DATEPART(yyyy,@Now),DATEPART(m,@Dob),DATEPART(d,@Dob)) THEN  --birthday has happened for the @now year, so add some portion onto the year difference
               (  1.0   --force automatic conversions from int to decimal
                  * DATEDIFF(day,DATEFROMPARTS(DATEPART(yyyy,@Now),DATEPART(m,@Dob),DATEPART(d,@Dob)),@Now) --number of days difference between the @Now year birthday and the @Now day
                  / DATEDIFF(day,DATEFROMPARTS(DATEPART(yyyy,@Now),1,1),DATEFROMPARTS(DATEPART(yyyy,@Now)+1,1,1)) --number of days in the @Now year
               )
             ELSE  --birthday has not been reached for the last year, so remove some portion of the year difference
               -1 --remove this fractional difference onto the age
               * (  -1.0   --force automatic conversions from int to decimal
                    * DATEDIFF(day,DATEFROMPARTS(DATEPART(yyyy,@Now),DATEPART(m,@Dob),DATEPART(d,@Dob)),@Now) --number of days difference between the @Now year birthday and the @Now day
                    / DATEDIFF(day,DATEFROMPARTS(DATEPART(yyyy,@Now),1,1),DATEFROMPARTS(DATEPART(yyyy,@Now)+1,1,1)) --number of days in the @Now year
                 )
         END AS AgeYearsDecimal
    


    1. SQLでSUBSTRINGを使用して文字のセットを取得するにはどうすればよいですか?

    2. Robolectricアクセスデータベースはエラーをスローします

    3. SQL Server(T-SQL)で「構成オプション「エージェントXP」が存在しません」を修正する方法

    4. CSVインポート操作の一部として、単一のステップでテーブルを作成してデータを設定するにはどうすればよいですか?