如何从sql中经过的天数中查找年份和月份

Posted

技术标签:

【中文标题】如何从sql中经过的天数中查找年份和月份【英文标题】:How to find year and Month from no of days passed in sql 【发布时间】:2018-01-22 09:14:21 【问题描述】:

我有过去的天数,我想使用大查询 SQL 找出特定日期间隔的月份和年份

例如:我有以下字段: date_today as DATE , day_passed 作为整数

    date_today = '2018-01-22'    
    day_passed =  32

从今天开始,我想使用 day_passed 列值创建一个新列,如下所示

    month_joined = '2017-12'

挑战:2 月(28 或 29)、30、31 月份可能有不同的日子

解决这个问题的最佳方法是什么?

【问题讨论】:

你可以使用DATE_ADD() 【参考方案1】:

在 tsql 中你可以使用这个查询,我建议你修改成一个函数。

declare @date nvarchar(20) = '2018-01-22'
declare @interval int = -32
declare @newDate datetime =  DATEADD(DAY,@interval,CAST(@date as datetime))
select cast(year(@newDate) as nvarchar(4)) +'-'+ cast(month(@newDate) as nvarchar(2)) as 'month_joined'

在 tsql 中创建一个函数:

CREATE FUNCTION YearMonthConvert(
    @Date datetime,
    @Interval int = 0)
RETURNS NVARCHAR(10)
AS
BEGIN
    DECLARE @newDate datetime = DATEADD(DAY,@Interval,CAST(@Date as datetime))
    RETURN cast(year(@newDate) as nvarchar(4)) +'-'+ cast(month(@newDate) as nvarchar(2))
END;

那么可以这样调用:

select dbo.yearmonthconvert('2018-01-22',-32)

我相信 mysql 语法如下 - 没有做过 mysql 所以如果有人想在 cmets 中纠正我,将不胜感激。

set @date  = '2018-01-22';
set @interval = -32;
set month_joined = DATE_ADD(@date, INTERVAL @interval DAY);

【讨论】:

【参考方案2】:

使用 mysql 函数 DATE_SUB 或者 DATE_ADD

SELECT DATE_SUB('2018-01-22', INTERVAL 32 DAY) 结果: 2017-12-21

【讨论】:

【参考方案3】:

以下是 BigQuery 标准 SQL 它应该让您了解如何在 BigQuery 中处理日期

#standardSQL
SELECT 
  date_today, 
  day_passed,
  DATE_SUB(date_today, INTERVAL day_passed DAY) day_joined,
  DATE_TRUNC(DATE_SUB(date_today, INTERVAL day_passed DAY), MONTH) month_joined_as_date,
  FORMAT_DATE('%Y-%m', DATE_SUB(date_today, INTERVAL day_passed DAY)) month_joined_as_string
FROM `yourproject.yourdataset.yourtable`   

您可以使用以下问题中的虚拟数据测试/玩上述内容

#standardSQL
WITH `yourproject.yourdataset.yourtable` AS (
  SELECT DATE '2018-01-22' date_today, 32 day_passed
)
SELECT 
  date_today, 
  day_passed,
  DATE_SUB(date_today, INTERVAL day_passed DAY) day_joined,
  DATE_TRUNC(DATE_SUB(date_today, INTERVAL day_passed DAY), MONTH) month_joined_as_date,
  FORMAT_DATE('%Y-%m', DATE_SUB(date_today, INTERVAL day_passed DAY)) month_joined_as_string
FROM `yourproject.yourdataset.yourtable`  

结果

date_today  day_passed  day_joined  month_joined_as_date    month_joined_as_string
2018-01-22  32          2017-12-21  2017-12-01              2017-12  

【讨论】:

【参考方案4】:

我在 bigquery 中以简单的方式解决了它

SUBSTR(STRING(DATE_ADD(DATE(date_today), -day_passed, "DAY")),1,7) AS month_joined

【讨论】:

以上是关于如何从sql中经过的天数中查找年份和月份的主要内容,如果未能解决你的问题,请参考以下文章

计算java中月份和年份的总天数[关闭]

如何在sql中从给定的月份和年份获取月份的第一天和最后一天

VBA如何将单元格中的年份转为天数

编程实现从键盘上输入年份和月份,即可输出该页对应的天数含(闰年)

SwiftUI 如何让 ForEach 循环根据 Picker 中选定月份的天数进行迭代

在MySql中、怎样根据年份或者月份查询数据表中的数据?