是否有任何独特的 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 选择查询中仅从时间戳中选择时间?