是否有任何独特的 SQL 函数可以从时间戳中仅检索年份和月份,并且基于该结果我需要找出最早制作的

Posted

技术标签:

【中文标题】是否有任何独特的 SQL 函数可以从时间戳中仅检索年份和月份,并且基于该结果我需要找出最早制作的【英文标题】:is there any unique SQL function to retrieve only year and month from the timestamp and based on that result i need to find out the earliest made 【发布时间】:2022-01-21 02:42:02 【问题描述】:

我尝试了下面提到的代码,但给出了不同的答案 使用代码

 $SELECT  MIN(DATENAME(MM,orders.occurred_at)) AS 'Month',
            MIN(DATENAME(YY,orders.occurred_at)) AS 'Year'
    FROM orders

表格

id  account_id  occurred_at
1   1001    2015-10-06 17:31:14.000
2   1001    2015-11-05 03:34:33.000
3   1001    2015-12-04 04:21:55.000
4   1001    2016-01-02 01:18:24.000
5   1001    2016-02-01 19:27:27.000
6   1001    2016-03-02 15:29:32.000
7   1001    2016-04-01 11:20:18.000
8   1001    2016-05-01 15:55:51.000
9   1001    2016-05-31 21:22:48.000
10  1001    2016-06-30 12:32:05.000
11  1001    2016-07-30 03:26:30.000
12  1001    2016-08-28 07:13:39.000
13  1001    2016-09-26 23:28:25.000
14  1001    2016-10-26 20:31:30.000
15  1001    2016-11-25 23:21:32.000
16  1001    2016-12-24 05:53:13.000
17  1011    2016-12-21 10:59:34.000
18  1021    2015-10-12 02:21:56.000
19  1021    2015-11-11 07:37:01.000
20  1021    2015-12-11 16:53:18.000

【问题讨论】:

如果您格式化您的数据以使其可读,并根据该样本数据包含您期望的输出,那么有人可能会尝试提供帮助。要提取日期的年份和月份部分,请查看documentation 在提取零件之前找到最小值。所以min() 将是参数/在其他函数中。 感谢您的建议@SMor 感谢您的帮助@shawnt00 【参考方案1】:

我不明白您是想查看所有结果并对其进行排序,以便最早的实例首先出现在列表中,还是只希望最早的记录本身。

时间戳对列表进行排序并显示时间戳中的Month()Year() 非常简单:

SELECT
   ID
  ,Account_ID
  ,Occurred_At
  ,MONTH(Occurred_At) AS Occurred_Month
  ,YEAR(Occurred_At) AS Occurred_Year
FROM Orders
ORDER BY Occurred_At ASC -- This puts the oldest record at the top of the list
;

如果您只想检索最旧的记录,那么您可以这样做:

SELECT TOP 1 -- This returns only the topmost record
   ID
  ,Account_ID
  ,Occurred_At
  ,MONTH(Occurred_At) AS Occurred_Month
  ,YEAR(Occurred_At) AS Occurred_Year
FROM Orders
ORDER BY Occurred_At ASC  -- This puts the oldest record at the top of the list
;

大概,您不需要从 Occurred_At 中提取月份和年份来知道哪个订单是第一个...时间戳为您提供了该信息。但是,如果出于某种原因,您想按月份和年份而不是完整的时间戳进行排序:

SELECT TOP 1
   ID
  ,Account_ID
--,Occurred_At -- If you don't need this line, you can remove it...
  ,MONTH(Occurred_At) AS Occurred_Month
  ,YEAR(Occurred_At) AS Occurred_Year
FROM Orders
ORDER BY Occurred_Year ASC, Occurred_Month ASC
;

【讨论】:

谢谢,这个解决了这个问题@3BK 假设索引你最好只排序我的原始列值而不是两个派生值。 @shawnt00 是的,你完全正确,但我给了他这个选项,因为我不完全清楚这是否是他出于某种原因需要的。【参考方案2】:

试试,

    SELECT  MONTH(occurred_at) AS Month,
            YEAR(occurred_at) AS Year
    FROM orders

   SELECT  FORMAT(occurred_at, 'MMMM') AS Month,
            FORMAT(occurred_at, 'yyyy') AS Year
    FROM orders

SELECT  
   FORMAT(occurred_at, 'y') AS 'Month and Year',
FROM orders

【讨论】:

嗨 @Nadeesh Hirushan 感谢您的时间和支持

以上是关于是否有任何独特的 SQL 函数可以从时间戳中仅检索年份和月份,并且基于该结果我需要找出最早制作的的主要内容,如果未能解决你的问题,请参考以下文章

如何在 mysql PDO 选择查询中仅从时间戳中选择时间?

从 SQL 中的时间戳中提取时间

我正在使用 Oracle SQL Developer 并希望从时间戳中提取星期几。我的语法是不是正确?

SQL 从时间戳中提取小时

在 MySQL 中仅检索固定数量的行

从纪元时间戳列中仅检索具有今天日期的记录