按照 SQL 书籍操作。使用 SQLite。
练习是归还‘庆祝日’。每个员工生日的月份第一天。
返回完整日期,其中星期始终为“01”。
以下代码运行,但未产生预期的结果。
SELECT
FirstName ||' '|| LastName AS [Full Name],
STRFTIME('%Y-%m-%d', BirthDate) AS [Birthday No Timecode],
DATE(STRFTIME('%m'), 'start of month') AS [Celebrated on]
FROM
employees;
结果如下:
Andrew Adams 1962-02-18 -4713-12-01
Nancy Edwards 1958-12-08 -4713-12-01
Jane Peacock 1973-08-29 -4713-12-01
Margaret Park 1947-09-19 -4713-12-01
Steve Johnson 1965-03-03 -4713-12-01
Michael Mitchell 1973-07-01 -4713-12-01
Robert King 1970-05-29 -4713-12-01
Laura Callahan 1968-01-09 -4713-12-01
我希望所有八名员工的最后一列都是“年-月-01”。
因此,第一个应该返回 1962-02-01,下一个应该返回 1958-12-01,等等。
尝试合并“月初”,如下所述: https: //www.sqlite.org/lang_datefunc.html
注意:我也尝试过:DATE(STRFTIME('%Y-%m'), 'start of month') AS [Celebrated on] 但这会为最后一列中的每个日期返回 Null。
我想要做的是读取每个员工出生日期中的月份,然后使用“月初”获取该月的第一天,然后返回完整的年份-月份-01。
要么是我的语法不好,要么是我的技术有缺陷。
每个月的开始是该月的第一天。
因此,只需打印出 01 而不是 %d,并保持日期不变。
您的一些技术存在缺陷:-
问题
DATE(STRFTIME('%m'), 'start of month')
并且也DATE(STRFTIME('%Y-%m'), 'start of month')
没有使用表中的任何值。因此,输出的Celebrated on
所有行的值都是相同的。此外,日期函数期望 datetime 参数符合某些格式,
strftime('%m')
例如 11(十一月),并且可以接受格式 12(参见下面的链接),该格式等同-4713-12-05
于'start of month'
应用了修饰符的日期-4713-12-01
。%m
),strftime
省略的日期时间值是now
。2024-11
,这是一个无效的日期时间值,因此为空。请参阅https://www.sqlite.org/lang_datefunc.html#time_valuesFIX (使用
start of month
修饰符)您可能想要的是使用(也许符合您问题的意图)
date(birthdate,'start of month')
。这:-使用日期函数,从出生日期列中提取时间值(有效格式为 YYYY-MM-DD),并通过
start of month
修饰符进行修改。演示
下面通过复制问题来说明上述内容,展示建议的修复方法并显示分解结果:-
导致:-