首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将日期时间转换为生肖名称

将日期时间转换为生肖名称
EN

Stack Overflow用户
提问于 2020-10-10 11:34:03
回答 3查看 262关注 0票数 0

我有一个人的出生日期是"12/02/1980 00:00:00“,但我想把它转换成生肖的名字。因此,我希望12/02/1980被显示为射手座。可以这样做吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-10-11 21:32:35

由于有一个固定的规则来匹配生肖和生肖,最简单的方法是一个案例:

代码语言:javascript
复制
CASE 
    WHEN MONTH(DateOfBirth) * 100 + DAY(DateOfBirth) BETWEEN 0120 AND 0219 THEN 'Aquarius'
    WHEN MONTH(DateOfBirth) * 100 + DAY(DateOfBirth) BETWEEN 0220 AND 0320 THEN 'Pisces'
    WHEN month(DateOfBirth) * 100 + DAY(DateOfBirth) BETWEEN 0321 AND 0419 THEN 'Ares'
    WHEN MONTH(DateOfBirth) * 100 + DAY(DateOfBirth) BETWEEN 0420 AND 0520 THEN 'Taurus'
    WHEN MONTH(DateOfBirth) * 100 + DAY(DateOfBirth) BETWEEN 0521 AND 0620 THEN 'Gemini'
    WHEN MONTH(DateOfBirth) * 100 + DAY(DateOfBirth) BETWEEN 0621 AND 0722 THEN 'Cancer'
    WHEN MONTH(DateOfBirth) * 100 + DAY(DateOfBirth) BETWEEN 0723 AND 0822 THEN 'Leo'
    WHEN MONTH(DateOfBirth) * 100 + DAY(DateOfBirth) BETWEEN 0823 AND 0922 THEN 'Virgo'
    WHEN MONTH(DateOfBirth) * 100 + DAY(DateOfBirth) BETWEEN 0923 AND 1022 THEN 'Libra'
    WHEN MONTH(DateOfBirth) * 100 + DAY(DateOfBirth) BETWEEN 1023 AND 1121 THEN 'Scorpio'
    WHEN MONTH(DateOfBirth) * 100 + DAY(DateOfBirth) BETWEEN 1122 AND 1221 THEN 'Sagittarius'
    ELSE 'Capricorn'
END
票数 1
EN

Stack Overflow用户

发布于 2020-10-10 12:34:49

能做这样的事

代码语言:javascript
复制
DECLARE @temp TABLE(DateOfBirth DATETIME);
INSERT INTO @temp VALUES ('19800517');

SELECT 
    DateOfBirth,
    CASE 
        WHEN DATEADD(YEAR,-DATEDIFF(YEAR,'19000101',DateOfBirth),DateOfBirth) BETWEEN CAST('19000321' AS DATETIME) AND CAST('19000419' AS DATETIME) THEN 'Ares'
        WHEN DATEADD(YEAR,-DATEDIFF(YEAR,'19000101',DateOfBirth),DateOfBirth) BETWEEN CAST('19000420' AS DATETIME) AND CAST('19000520' AS DATETIME) THEN 'Taurus'
        WHEN DATEADD(YEAR,-DATEDIFF(YEAR,'19000101',DateOfBirth),DateOfBirth) BETWEEN CAST('19000521' AS DATETIME) AND CAST('19000620' AS DATETIME) THEN 'Gemini'
        WHEN DATEADD(YEAR,-DATEDIFF(YEAR,'19000101',DateOfBirth),DateOfBirth) BETWEEN CAST('19000621' AS DATETIME) AND CAST('19000722' AS DATETIME) THEN 'Cancer'
        WHEN DATEADD(YEAR,-DATEDIFF(YEAR,'19000101',DateOfBirth),DateOfBirth) BETWEEN CAST('19000723' AS DATETIME) AND CAST('19000822' AS DATETIME) THEN 'Leo'
        WHEN DATEADD(YEAR,-DATEDIFF(YEAR,'19000101',DateOfBirth),DateOfBirth) BETWEEN CAST('19000823' AS DATETIME) AND CAST('19000922' AS DATETIME) THEN 'Virgo'
        WHEN DATEADD(YEAR,-DATEDIFF(YEAR,'19000101',DateOfBirth),DateOfBirth) BETWEEN CAST('19000923' AS DATETIME) AND CAST('19001022' AS DATETIME) THEN 'Libra'
        WHEN DATEADD(YEAR,-DATEDIFF(YEAR,'19000101',DateOfBirth),DateOfBirth) BETWEEN CAST('19001023' AS DATETIME) AND CAST('19001121' AS DATETIME) THEN 'Scorpio'
        WHEN DATEADD(YEAR,-DATEDIFF(YEAR,'19000101',DateOfBirth),DateOfBirth) BETWEEN CAST('19001122' AS DATETIME) AND CAST('19001221' AS DATETIME) THEN 'Sagittarius'
        WHEN DATEADD(YEAR,-DATEDIFF(YEAR,'19010101',DateOfBirth),DateOfBirth) BETWEEN CAST('19001222' AS DATETIME) AND CAST('19010119' AS DATETIME) THEN 'Capricorn'
        WHEN DATEADD(YEAR,-DATEDIFF(YEAR,'19000101',DateOfBirth),DateOfBirth) BETWEEN CAST('19000120' AS DATETIME) AND CAST('19000219' AS DATETIME) THEN 'Aquarius'
        WHEN DATEADD(YEAR,-DATEDIFF(YEAR,'19000101',DateOfBirth),DateOfBirth) BETWEEN CAST('19000220' AS DATETIME) AND CAST('19000320' AS DATETIME) THEN 'Pisces'
    END
FROM @temp
票数 0
EN

Stack Overflow用户

发布于 2020-10-10 16:12:16

转换任何日期时间(或datetime2)的一种方法是使用表值函数。下面的tvf不引用任何物理表,因此(为了稍微提高性能)可以指定“使用SCHEMABINDING”,这意味着函数不必在绑定之前检查对象的存在。该符号摩羯座跨越年底和年初的月份/日期范围,因此它被输入在zodiac_table虚拟表中的2行。

tvf

代码语言:javascript
复制
drop function if exists [dbo].convert_datetime_to_zodiac;
go
create function [dbo].convert_datetime_to_zodiac(
    @dtm       datetime2)
returns table with schemabinding as return 
with z_cte(start_mo, start_day, end_mo, end_day, zodiac_sign) as (
    select start_mo, start_day, end_mo, end_day, zodiac_sign 
    from (values (3, 21, 4, 19, 'Ares'),
                 (4, 20, 5, 19, 'Taurus'),
                 (5, 21, 6, 19, 'Gemini'),
                 (6, 21, 7, 19, 'Cancer'),
                 (7, 23, 8, 19, 'Leo'),
                 (8, 23, 9, 19, 'Virgo'),
                 (9, 23, 10, 19, 'Libra'),
                 (10, 23, 11, 19, 'Scorpio'),
                 (11, 22, 12, 19, 'Sagittarius'),
                 (12, 22, 12, 31, 'Capricorn'),
                 (1, 1, 1, 19, 'Capricorn'),
                 (1, 20, 2, 19, 'Aquarius'),
                 (2, 20, 3, 20, 'Pisces'))
                 zodiac_table(start_mo, start_day, 
                              end_mo, end_day, zodiac_sign))
select z.zodiac_sign
from z_cte z
     cross apply (select year(@dtm) dtm_yr) dtm
where cast(@dtm as date) between datefromparts(dtm.dtm_yr, z.start_mo, z.start_day)
                             and datefromparts(dtm.dtm_yr, z.end_mo, z.end_day);
go

查询示例

代码语言:javascript
复制
select * from dbo.convert_datetime_to_zodiac('05/02/1980 00:00:00');
select * from dbo.convert_datetime_to_zodiac('01/22/1980 00:00:00');
select * from dbo.convert_datetime_to_zodiac('01/02/1980 00:00:00');

输出

代码语言:javascript
复制
zodiac_sign
Taurus

zodiac_sign
Aquarius

zodiac_sign
Capricorn

如果日期时间在表中,则使用如下所示的tvf交叉应用

代码语言:javascript
复制
with table_containing_a_date_cte as (
    select cast('03/27/1999 00:00:00' as datetime) as dtm)
select conv.zodiac_sign
from table_containing_a_date_cte dc
     cross apply dbo.convert_datetime_to_zodiac(dc.dtm) conv;

输出

代码语言:javascript
复制
zodiac_sign
Ares
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64292953

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档